2011-07-07 9 views
3

私はSLのパフォーマンスの問題を解決しようとしています。 今まで私はInvokeAsyncによって実行されたWCF呼び出しを持っていました。 今、私はBackgroundWorkerを使うように変更しました。 パフォーマンスが大幅に向上しました。Silverlight UIスレッドで、InvokeAsyncを実行すると何が起こりますか?

この原因は何ですか? InvokeAsyncがUIスレッドに影響を与えたのは何ですか?別のUIスレッドを開いていますか?

ありがとうございます。

答えて

4

これは同期コンテキストになります。スレッドは、DispatcherSynchronizationContext(これはUIスレッドのコンテキストであり、この1つのスレッドのみを含む)などのSynchronizationContextに関連付けることができます。 WCFは、開始されたのと同じ同期コンテキストで操作を完了します。スレッドに関連付けられた同期コンテキストがない場合、スレッドプール内の任意のスレッドが使用されます。

したがって、UIスレッドからすべての非同期操作が呼び出された場合、それらの操作はすべてUIスレッドで完了コードを実行することになります。複数のスレッドが同時に完了した場合、完了コードはこの単一のUIスレッドにディスパッチされるのを待ってキューに待機する必要があります。

バックグラウンドワーカーで非同期操作を呼び出すと、スレッドプールからのスレッドで実行され、特殊な同期コンテキストはありません。これらの操作が完了すると、完了コードはプール内の利用可能なスレッド(いくつかのスレッドがある)で実行されます。したがって、同時完了の近くではすべて異なるスレッドですべて並列に実行できます。

0

WPFとSilverlightでは、SynchronazationContextを使用してメインスレッドを保存することをお勧めします。他のすべてのスレッドは、このSynchronazationContextのインスタンスを使用してメインスレッド(UI)にアクセスします。あなたは(:私はこれを行う方法を生成し、他のすべてのメソッドは、UIを更新するには、このメソッドにアクセスします注意してください):この方法でそれを使用

SynchronazationContext ctx = null; 
void DoSomething() 
{ 
    ctx = SynchronazationContext.Current; 
    //Some algorithm here 
    this.UpdatePic("Success !"); 
} 
void ThreadProc() 
{ 
    SendOrPostCallback callBack = new SendOrPostCallback(UpdatePic); 
    ctx.Post(callBack, String.Format("Put here the pic path"); 
} 
void UpdatePic(string _text) 
{ 
    //This method run under the main method 
} 

.NET 5.0では、あなたがマークインクルードすることで、この複雑な機能を呼び出すことができます同期メソッドを非同期メソッドとして作成し、メインスレッドでUIを更新する、同期メソッドを呼び出すと、非同期メソッドと書き込み 'await'メソッドを呼び出します。

関連する問題