BlockingCollectionを使用することをお勧めします。ログに書き込みたいスレッドは、ログ文字列をBlockingCollection
. 別のスレッドが を監視しBlockingCollection
、文字列をデキューしてファイルに書き込みます。ファイルが利用できない場合、スレッドは待機して再試行できます。
簡単な例については、 http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821を参照してください。
を使用できない場合はBlockingCollection
、キューを使用してロックで保護できます。何かを記録する方法は次のようになります。
private Queue<string> myQueue = new Queue<string>(); // owned by the logger
void WriteLog(string s)
{
lock (myQueue)
{
myQueue.Enqueue(s);
}
}
ものを削除するスレッドは、キューからそれらを取得できます。定期的にポーリングする必要があるため、理想的とは言えませんが、それほど悪くはありません。
while (!shutdown) // do this until somebody shuts down the program
{
while (myQueue.Count > 0)
{
lock (myQueue)
{
string s = myQueue.Dequeue();
// write the string s to the log file
}
}
Thread.Sleep(1000); // sleep for a second and do it again.
}
忙しい待機なしでそれを行う方法はありますが、実装の詳細を覚えていません。サンプルについては、http://msdn.microsoft.com/en-us/library/system.threading.monitor.pulse.aspxを参照してください。