2

いくつかのコンテンツをローカルファイルに書き込み、それをテキストブロックで表現したいと思います。CreateFileとOutputの2つのメソッドがあります。最初のメソッドは、WriteTextAsyncメソッドを使用してコンテンツをファイルに書き込み、2番目のメソッドはReadTextAsyncメソッドを使用してコンテンツを読み取ります。私は2つのメソッドを1つずつ呼び出しました。

CreateFile(data);
Output(file);

fileはグローバル変数であり、CreateFileメソッドは「データ」をファイルに書き込み、Outputメソッドはその内容を出力します。残念ながら、常に動作するとは限りません。「オブジェクト参照がオブジェクトに設定されていません」という例外が発生することがあります。調査したところ、ファイルがnullであることがわかりました。これは、Outputメソッドが実行されたためと思われますが、ファイルは作成が完了していません。したがって、ブレークポイントを追加すると、常に機能します。ファイルの作成が完了した後にOutputメソッドを実行させる方法を教えてください。

ありがとう

4

2 に答える 2

9

理由の1つは、2番目のメソッドがファイルを読み取ろうとしたときに、ファイルがまだ作成されていないことである可能性があります。

図1

したがって、2番目のメソッドは最初のメソッドが終了するまで待機する必要があります。

図2

それを達成するためのいくつかの方法があります。

それらの1つは、タスク並列ライブラリのタスククラスとその待機メソッドを使用することです。

var task = new Task(() => CreateFile(data));
task.Wait();

もう1つ、たとえば、ManualResetEventクラス

ManualResetEventを使用すると、スレッドはシグナリングによって相互に通信できます。通常、この通信は、他のスレッドが続行する前に1つのスレッドが完了しなければならないタスクに関係します。

他のいくつかの関連リンク:

于 2012-10-29T04:10:30.617 に答える
1

メソッドは非同期メソッドを呼び出すため、簡単な修正は次のようにメソッドを呼び出すことです。

await CreateFile(data);   // This waits for the method to complete before continuing.  
Output(file);
于 2012-10-29T04:31:18.097 に答える