34

私はまだタスクの概念全体と TPL を学んでいます。私の現在の理解では、SynchronizationContext 関数 (存在する場合) はawait、Task を「どこかに」ディスパッチするために使用されます。一方、Taskクラス内の関数はコンテキストを使用しませんよね?

たとえばTask.Run(...)、常にスレッド プールのワーカー スレッドでアクションをディスパッチし、SynchronizationContext.Current完全に無視します。await Foobar()コンテキストを使用して、await?の後に生成されたタスクを実行します。

Taskそれが本当なら、私の質問は次のとおりです。実際にアクションを実行するが、を使用してディスパッチされるを取得するにはどうすればよいSynchronizationContext.Current.Send/Postですか?

SynchronizationContextそして、特にフレームワークの残りの部分でいつ、どのように使用されるかについて、誰でも良い導入を推奨できますか? MSDNはこのクラスについて非常に静かなようです。Google の上位ヒット (ここここ) は、Windows フォームのディスパッチのみに合わせて調整されているようです。Stephen Cleary は、どのコンテキストが既に存在し、どのように機能するかを学ぶのに役立つ記事を書きましたが、実際にいつどこで使用されるかについては理解していません。

4

2 に答える 2

49

実際にはアクションを実行するが、SynchronizationContext.Current.Send/Post を使用してディスパッチされる Task を取得するにはどうすればよいですか?

特別なタスク スケジューラを使用します。

Task.Factory.StartNew(
    () => {}, // this will use current synchronization context
    CancellationToken.None, 
    TaskCreationOptions.None, 
    TaskScheduler.FromCurrentSynchronizationContext());

そして、誰でもSynchronizationContextの優れた紹介を推奨できますか

Stephen Cleary による記事It's All About the SynchronizationContextを参照してください。

于 2013-06-04T11:19:07.910 に答える