12,925
回編集
(→概要) |
(→例外処理) |
||
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> |