2011-10-12 12 views
8

私は新しいC#async/await機能のCTPをチェックアウトする機会はありませんでしたが、ここに私が不思議に思っていたことがあります:C#5の新しい非同期/待機機能は、メッセージループとどのように統合されますか?

メッセージループとはどのように統合されますか?私は、標準のWindowsアプリケーション(Winforms、WPF)では、Dispatcherなどを使用して、アプリケーションのメッセージループにメッセージを送信することによって継続が呼び出されると想定していますか?

標準のWindowsメッセージループを使用していない場合はどうなりますか?たとえば、GTK#アプリケーションやコンソールアプリケーション(実際には、この機能はコンソールアプリケーションではまったく使用できません)。

私はこれについての情報をインターネットで検索しましたが、無駄です。誰でも説明できますか?

答えて

5

System.Threading.SynchronizationContext.Currentを使用します。 WPFとWinformsはいずれも独自のバージョンのSynchronizationContextをインストールします。メッセージループを使用して、ワーカースレッドからの呼び出しをメインのUIスレッドにマーシャリングします。 Dispatcher.Begin/InvokeおよびControl.Begin/Invoke()にそれぞれ対応しています。

コンソールモードのアプリケーションでこれを行うのは簡単ではありませんが、メインスレッドは、再突入の頭痛を避ける安全な方法でマーシャリングされたメソッド呼び出しを注入できる「アイドル」状態がありません。あなたは確かにそれを追加することができますが、メッセージループを再発明することになります。

+0

Thanks Hank。 asyncがコンソールアプリケーションで使用され、失敗する状況を考えようとしています。だから私は、この状況では同期の文脈の欠如が主に疑問だと思う。 – Grokys

+3

[AsyncEx](http://nitoasyncex.codeplex.com/)には、コンソールアプリケーション用の非同期互換メインループを提供する[AsyncContext](http://nitoasyncex.codeplex.com/wikipage?title=AsyncContext)クラスが含まれています(および単体テスト)。 –

+0

'SynchronizationContext' [here]の詳細(http://msdn.microsoft.com/en-us/magazine/gg598924.aspx)。 –

4

「オーウェター」は、それが終わった後も続きます。

BCLで Task<T>の実装は、現在の同期コンテキスト( unless you ask it not to using ConfigureAwait)使用する

- それはディスパッチャを使用しますWPF/Silverlightの手段とWindowsフォームではControl.BeginInvokeのようなものを使用し、スレッドプールスレッドではスレッドプールスレッド上で実行し続けるだけです。重要なのは、現在のコンテキストです。これは、継続を実行するためにタスクがキャプチャするものなので、表現が待たれているのは、です。

リンクされたブログ記事(Mads Torgersen)は、すべてがどのように機能するかを説明する素晴らしい仕事をしています。series of blog postsもあります。

+0

ありがとうございました。 .Netの土地での私のツアーでは、SynchronizationContext.Currentを一度も見かけませんでした。これは、「現在の同期コンテキスト」が意味するものですか?毎日何か新しいことを学ぶ。 – Grokys

+1

@Groky:はい。 asyncのパフォーマンスに関するStephen Toubの記事の詳細は次のとおりです。http://msdn.microsoft.com/en-us/magazine/hh456402.aspx –

関連する問題