テキストファイルに書き込むメソッドが与えられた場合
public void WriteToFile( ) {
var file = "C:\\AsyncTest.txt";
var writer = File.Exists( file ) ? File.AppendText( file ) : File.CreateText( file );
writer.WriteLine( "A simulated entry" );
writer.Close();
}
このメソッドがループ内で (おそらく数十回) 呼び出される可能性があり、非同期で実行する必要があるシナリオをシミュレートする必要があります。
だから私はそのように新しいスレッドでメソッドを呼び出してみました(ライターはWriteToFileが存在するクラスです)
//in a loop...
Thread thread = new Thread( writer.WriteToFile );
thread.Start( );
これは一度完全に機能しますが、ファイルが後続の反復で別のプロセスによって使用されているという IO 例外をスローします。実際、これは完全に理にかなっていますが、それを回避する方法がわかりません。
このように Join() を使用してみました
Thread thread = new Thread( writer.WriteToFile );
thread.Start( );
thread.Join();
しかし、それは結合されたすべてのスレッドが完了するまで呼び出し元のスレッドをロックします。
を使用してみThreadPool.QueueUserWorkItem(writer.WriteToFile);
ましたが、同じ IO 例外が発生します。
ロックを使ってみた
private object locker = new object();
public void WriteToFile( ) {
lock(locker){
//same code as above
}
}
しかし、それは明らかな効果がありませんでした
また、 Task クラスを使用してみましたが、役に立ちませんでした。
では、これらのバックグラウンド スレッドを「スタック」して、呼び出し元のスレッドをロックせずに、競合することなく単一のファイルに書き込むにはどうすればよいでしょうか?