3

Async CTP に関するビデオを見ていましたが、たとえばメイン スレッドから await を呼び出すと、作業が完了するとメイン スレッドから実行が続行されることがわかりました。

例えば

//called from main thread
var result = await SomeAsyncWork();
//this will execute in main thread also
console.writeline(result)

ワーカー スレッドで実行される通常のコールバックが行われるという素朴な印象を受けました。

Task.FromAsync を使用して T のタスクで通常の非同期メソッドをラップできるため、あるレベルで何が起こっているに違いないか

しかし、通常の非同期メソッドはワーカー スレッドで実行されるため、ワーカー スレッドのコールバックはどのようにメイン スレッドにマーシャリングされるのでしょうか?

4

2 に答える 2

6

コールバックは、現在のタスク スケジューラを使用してタスクにアタッチされます (これは、待機中は「現在」であり、完了時には現在ではありません)。UI スレッドの場合、現在のタスク スケジューラはコールバックが UI スレッド内で実行されるようにスケジュールします。スレッド プール スレッドの場合、スケジューラは任意のスレッド プール スレッドでの実行を許可します。

を待っていると仮定するとTask<T>、事実上 を呼び出していTask<T>.ContinueWith(continuationAction, scheduler)ます。

利用可能な適切なメソッドを使用して何でも待機できますがBeginAwait、継続をどのようにスケジュールするかは実装固有です。おそらく最も一般的なものであるため、タスクベースのものについてのみ言及しました。コンパイラ自体はこれをまったく指定していません-ライブラリが正しいことを行うと想定しています。コンパイラが行うのは、「メソッドの残りの部分」を継続に変換し、それを に渡すことだけBeginAwaitです。

于 2011-04-13T09:37:23.363 に答える
0

コンパイラはコードを別の方法でコンパイルして分割し、await の後のコードがコールバックになるようにします。ここにある程度詳細な説明があります: http://evolpin.wordpress.com/2011/05/02/c-5-await-and-async-in-asp-net/

于 2011-05-04T03:30:01.887 に答える