私は c# の新しい await/async キーワードに慣れようとしていますが、よく理解できない側面がいくつか見つかりました。
競合状態から始めましょう:
Stream s=... ... for(int i=0;i<100;i++) { s.WriteAsync(new byte[]{i},0,1); }
これは常に期待どおりに機能しますか (たとえば、13254 などではなく、ファイル 12345..... に書き込みます)?
2 つ目は、await 演算子が含まれていない場合、非同期関数が同期的に実行されることです。また、マイクロソフトのドキュメントによると、非同期関数は常に呼び出し元スレッドで実行されます (BeginInvoke と比較して)。これにより、次の 3 つの質問が表示されます。
呼び出し元の関数にリリースされる前に、非同期関数はどの程度実行されますか?
async void MyAsyncFunction() { Operation1(); Operation2(); Operation3(); .... Stream s=...; await s.WriteAsync(....); }
私が読んだ await/async に関する記事では、await 演算子を使用しない非同期関数は順次実行され、async/await を使用するとすぐに戻ると書かれていました。
MyAsyncFunction
しかし、いつでも Operation1...Operation3 を実行してから、ヒットしたときにリリースすることができるのは私にはしつこいですawait s.WriteAsync
。Thread.Sleep
次のように非同期関数で使用するとどうなりますか。async void DoStuff() { Stream s=...; ... await s.WriteAsync(....); Thread.Sleep(10000); .... }
Thread.Sleep は、それが実行されるスレッド全体をブロックしますか、それとも非同期関数だけをブロックしますか?
非同期関数の 1 つで使用
semaphore.Wait()
し、セマフォが他の非同期関数によって解放されることを期待するとどうなりますか。これはスレッドの場合と同じように動作しますか、それともデッドロックを引き起こしますか?await
非同期関数の外では機能しません。なんで?