通常の処理であれば同一ファイルへの書き込みと読み込みはそれぞれ他方が終わってから行なわれるので、あまり気にすることはありません。しかし非同期処理の場合は書き込みが完了するまえに別の書き込みの処理が始まったり、書き込みをしている最中に読み込みがはじまることがあります。この場合はどうなるのでしょうか?

以下はテキストファイルへ0.1秒ごとに”0″~”9″までを書き込むコードです。

実行結果

同時に同じファイルに書き込もうとした場合

では同時に同じファイルに書き込もうとした場合はどうなるのでしょうか?

実行結果

回避策

同時に書き込もうとすると例外が発生してしまいます。この問題を回避するためにはawaitをつけるしかありません。

同時に読み込もうとした場合

では同時に読み込もうとした場合はどうなるのでしょうか?

この場合は同時に読み込むことができます。非同期処理なので引数:2の処理のほうが先に出力される場合があります。

実行結果

同時に書き込みと読み込みをしようとした場合

では書き込みをしている最中に読み込みを開始したらどうなるのでしょうか?

2秒あればおそらくSaveFileメソッドは完了するということで2秒待ってから読み込みを開始しています。この場合は特に問題なく読み込みの処理がおこなわれます。

ではThread.Sleepメソッドの引数を800くらいにすればどうなるでしょうか? 書き込みは完了していないのに読み込みが開始されることになります。

実行結果は以下のとおり。書き込みの最中に読み込もうとすると例外が発生します。

実行結果

では逆に読み込みをしている最中に書き込みを開始したらどうなるのでしょうか?

例外が発生して書き込みは失敗します。

実行結果

非同期処理と例外処理

上の場合は例外を捕捉できますが、下の場合は例外を捕捉できません。