5

私が最近自分の費用で発見したように、await同期コンテキストがないときに実行すると、待機が別のスレッドで実行された後にコードが生成される可能性があります。

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

私の質問は、フォームを作成することが同期コンテキストを確保するための最良/最も効率的な方法であるかどうか、またはそれを行うためのより簡単な方法があるかどうかです。

4

2 に答える 2

5

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

これを回避する最も簡単な方法は、SynchronizationContextOdds and Endsのブログで説明されています。ここでは、記事の調査中に見つけたいくつかの雑多なことを簡単に説明していますが、含めるほど重要ではありませんでした。この問題を修正するには、すべてのイベントの開始時に、次のようにします。

SynchronizationContext.SetSynchronizationContext(
    new WindowsFormsSynchronizationContext());

awaitその後は、STAスレッドで再開する必要があります。

于 2012-10-06T01:05:09.730 に答える
3

メッセージポンプなしでSynchronizationContextを設定する方法を説明しているこの記事をチェックすることをお勧めします。これは、待機する予定の他の作業がある場合にのみ実際に役立つことに注意してください(複数のコールバックをキューに入れる)。一度に1つだけ待機する場合は、コードを同期して実行するだけでよい場合があります。メッセージポンプを実行するなど、アイドル時間とは何の関係もありません。

于 2012-10-05T23:09:06.510 に答える