「C Sharpの基礎 - マルチスレッド」の版間の差分

ナビゲーションに移動 検索に移動
330行目: 330行目:
                 .Select(f => new { File = f.File, Hash = SHA256.Create().ComputeHash(f.Data)})  // 処理B(ハッシュ値計算)
                 .Select(f => new { File = f.File, Hash = SHA256.Create().ComputeHash(f.Data)})  // 処理B(ハッシュ値計算)
                 .ToArray();
                 .ToArray();
</syntaxhighlight>
<br><br>
== 排他処理 ==
==== lockキーワードの使用 ====
以下の例では、排他処理 (<code>lock</code>キーワード) を使用してテキストファイルを2つのスレッドから読み書きしている。<br>
<syntaxhighlight lang="c#">
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
class Program
{
    private static readonly object fileLock = new object();
    private const string fileName = "sample.txt";
    static async Task Main(string[] args)
    {
      try
      {
          Task readTask = ReadFileAsync();
          Task writeTask = WriteFileAsync();
          await Task.WhenAll(readTask, writeTask);
      }
      catch (Exception ex)
      {
          Console.WriteLine($"メインプロセスでエラーが発生: {ex.Message}");
      }
      finally
      {
          Console.WriteLine("プログラムの終了");
      }
    }
    static async Task ReadFileAsync()
    {
      for (var i = 0; i < 10; i++)
      {
          try
          {
            string content = await ReadFromFileAsync();
            Console.WriteLine($"読み込んだ内容: {content}");
          }
          catch (Exception ex)
          {
            Console.WriteLine($"読み込み中にエラーが発生: {ex.Message}");
          }
          await Task.Delay(1000);
      }
    }
    static async Task WriteFileAsync()
    {
      int counter = 0;
      for (var i = 0; i < 10; i++)
      {
          try
          {
            string content = $"カウンター: {counter++}";
            await WriteToFileAsync(content);
            Console.WriteLine($"書き込んだ内容: {content}");
          }
          catch (Exception ex)
          {
            Console.WriteLine($"書き込み中にエラーが発生: {ex.Message}");
          }
          await Task.Delay(1500);
      }
    }
    static async Task<string> ReadFromFileAsync()
    {
      if (!File.Exists(fileName))
      {
          throw new FileNotFoundException($"ファイルが見つかりません: {fileName}");
      }
      try
      {
          lock (fileLock)
          {
            using (StreamReader reader = new StreamReader(fileName))
            {
                return reader.ReadToEnd();
            }
          }
      }
      catch (IOException ex)
      {
          throw new IOException($"ファイルの読み込み中にエラーが発生: {ex.Message}", ex);
      }
    }
    static async Task WriteToFileAsync(string content)
    {
      try
      {
          lock (fileLock)
          {
            using (StreamWriter writer = new StreamWriter(fileName, false))
            {
                writer.Write(content);
            }
          }
      }
      catch (IOException ex)
      {
          throw new IOException($"ファイルの書き込み中にエラーが発生: {ex.Message}", ex);
      }
    }
}
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>

案内メニュー