ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

C# System.IO.StreamWriterクラスを使って、同時にファイルに書き込もうとすると、例外が発生する

C#で作ったプログラムで、ログをファイルに書き出す機能を作成しました。
ファイルに書き込むには、System.IO.StreamWriterクラスを使いました。
docs.microsoft.com
System.IO.StreamWriterオブジェクトを生成して、WriteLineメソッドで文字列を書き込み、Closeメソッドで終了という簡単な内容です。

このC#のプログラムは、Taskクラスを使って、非同期処理を実現しています。
非同期処理なので、処理状況がわかりづらく、ログファイルに処理状況を書き込むようにしました。

非同期処理は2つあり、C#で作ったプログラムの起動時に、開始されます。
ログファイルを見ていると、開始時のメッセージが、1つの非同期処理の分しかありませんでした。
もう1つの非同期処理の、開始時のメッセージは、ログファイルに書かれていません。

1つの非同期処理の分の、開始時のメッセージは書かれているので、書き込みを行っているはずです。
開始時以外のメッセージは、ログファイルに書かれています。

プログラミング
Photo by Maxwell Nelson on Unsplash

どこがおかしいのか、どうやって調べればいいのか考えていたところ、同時に書き込みができなくて、メソッドのエラーか、例外が発生しているのではないか、と思いました。
戻り値はチェックしていなくて、例外はキャッチしても、なにもしていない状態です。
まず、例外をキャッチしたら、コンソールに出力するようにしました。

改めて動作させたところ、例外が発生していました。
例外のメッセージを確認すると、同時に書き込みをしようとしたためだとわかりました。
同時に書き込みをしないようするには、どうするとか考え、Mutexを使って排他処理を行うようにしました。


書き込めなければ、例外ではなく、待機するものだと思い込んでいました。
そのため、なぜログが出力されないのか、と悩みました。