2012-10-05 6 views
5

私は最近、私のコストを発見したので、同期コンテキストがないときにawaitを実行すると、別のスレッドで実行待ちの後にコードが返される可能性があります。同じスレッドで実行を待ってから、どのように継続を取得できますか?

私は現在、VSTOオフィスアドインで奇妙な動作に問題がありますが、これはおそらくこの動作の結果と思われます。 Officeアプリケーションによって生成されたイベントを処理する場合、(同期コンテキストを作成するフォームを作成しない限り)同期コンテキストはありません。

私の質問は、フォームを作成することが、同期コンテキストがあることを確認するための最も効果的な方法か、最も簡単な方法かどうかです。

+0

この場合、 'await'を使用しないほうが簡単でしょうか?使用しているAPIが非同期のみの場合は、 'Task'の' Result'または 'Wait()'を使って実現できます。 – svick

+0

@スヴィック:あなたが言っていることは、待っているスレッドを同じスレッドに戻したいのであれば、それは事実上「同期的な」振る舞いです。うーん...はい、そうだね。 *一口*。私は正直言って、このもので少し失われています。 –

答えて

5

Officeアプリケーションは、STAコンテキストでイベントを呼び出すが、適切なSynchronizationContextは提供していません。

これを回避する最も簡単な方法は、私のブログのSynchronizationContext Odds and Endsに説明されています。ここでは、私の記事のための調査をしている間に見つけたいくつかの雑多なことについて簡単に説明します。すべてのイベントの冒頭で、この問題を解決するには、次の操作を行います。その後

SynchronizationContext.SetSynchronizationContext(
    new WindowsFormsSynchronizationContext()); 

どれawait sがSTAスレッド上で再開すべきです。

+0

誰もがこれを考えていることに注意してください - http://stackoverflow.com/q/12898569/98422も参照してください。 –

3

メッセージポンプなしでSynchronizationContextを設定する方法については、this articleを参照してください。これは実際には、あなたが待つつもりである(複数のコールバックを待ち行列に入れる)ことを期待している場合にのみ便利です。一度に1つのことを待っていれば、コードは同時に同期して実行することもできます。メッセージポンプを動かすなど、あなたのアイドルタイムとは何か関係がありません。

関連する問題