新しいスレッドで完了イベントを開始するタイミングまたは呼び出し元スレッドを使用するタイミングを非同期呼び出しはどのように知るのですか

asynchronous c# silverlight
新しいスレッドで完了イベントを開始するタイミングまたは呼び出し元スレッドを使用するタイミングを非同期呼び出しはどのように知るのですか

「DoWork」メソッドを持つサービス「TestService」があるとしましょう。 クライアントでは、 DoWorkCompleted`および DoWorkAsync`メソッドを生成します。

これは、UIスレッドから「DoWorkAsync」を呼び出すと、期待どおりに「DoWorkCompleted」がUIスレッドで実行されるという私の観察です。

しかし、「BackgroundWorker」を開始し、そこから「DoWorkAsync」サービスを呼び出すと、「DoWorkCompleted」が呼び出し元スレッド以外の新しいスレッドで実行されます。 例:

  1. `BackgroundWorker`インスタンスを開始←UIスレッドから

  2. ワーカーの `DoWork`メソッドが実行される←スレッド2

  3. ワーカー「DoWork」からサービス「DoWorkAsync」を呼び出す←スレッド2から

  4. サービスが実行され、 `DoWorkCompleted`が実行されます←スレッド3

  5. ワーカー `DoWorkCompleted`が実行される←UIスレッド

サービスクライアントは、いつ新しいスレッドを開始し、いつそれを呼び出し元スレッドにポストバックするかをどのように知るのですか?

  1  0


ベストアンサー

これは、スレッド上のhttp://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx [SynchronizationContext]の可用性に関係しています。 Windowsフォームでは、Silverlightが同じであると仮定します。アプリケーションを起動すると、UIスレッドになるメインスレッドにhttp://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontextが提供されます。 .aspx [SynchronizationContext]は、呼び出しをUIスレッドにマーシャリングして戻すことを許可します。

最初のシナリオでは、同期コンテキストが利用可能なスレッドから「DoWorkAsync」を呼び出すため、「DoWorkCompleted」は初期スレッドにマーシャリングされます。

2番目のシナリオでは、同期コンテキストのないスレッドプールスレッド上にいるので、 `DoWorkCompleted`は初期スレッドにマーシャリングされません。

3


タイトルとURLをコピーしました