通常情況下,OnDoSomethingCompleted()將UI線程,即在被執行時,幕後的東西是調用一些代碼(在概念上)看起來有點像這樣:
Dispatcher.BeginInvoke(() => OnDoSomethingCompleted());
這意味着OnDoSomethingCompleted( )在UI線程決定合作並運行之前不會執行。大多數時間沒問題,但有時候你希望它運行得更快。基本的方法是使用線程池進行原始調用,這意味着響應將從同一個線程池(不一定在同一個線程上)處理。如果你可以在這個返回方法中做一些真正的處理,並且不只是自動將它們編組回到UI線程,這可以加快你的處理速度。
託梅克(從MS WCF小組)給出瞭如何在這裏做一個很好的例子:
http://tomasz.janczuk.org/2009/08/improving-performance-of-concurrent-wcf.html
這也是我的理解,對於WCF連接的同步情況下被設定,當你第一次打開它。這意味着無論第一次打開WCF連接的線程是處理所有稍後調用的線程。因此,在我自己的代碼,我做這樣的事情:
// Spin up the connection on a new worker thread.
// According to Tomek, this will cause all WCF calls to be made from this thread.
ManualResetEvent resetEvent = new ManualResetEvent(false);
wcfWorkerThread = new Thread(new ThreadStart(() => InitializeNotificationClient(resetEvent)));
wcfWorkerThread.Name = "WcfWorkerThread";
wcfWorkerThread.Start();
resetEvent.WaitOne();
然後InitializeNotificationClient()看起來是這樣的:
private void InitializeNotificationClient(ManualResetEvent resetEvent = null)
{
try
{
notificationClient = GetRoomServiceClient();
notificationClient.OpenAsync(callback);
notificationClient.InnerChannel.Faulted += new EventHandler(Channel_Faulted);
notificationClient.InnerChannel.Closed += new EventHandler(Channel_Closed);
}
finally
{
// Tell the waiting thread that we're ready.
if (resetEvent != null)
{
resetEvent.Set();
}
}
}
是UI線程上執行的回調? – Gabe 2010-10-05 15:28:55
顯示代碼OnDoSomethingCompleted。 – AnthonyWJones 2010-10-05 16:20:10
DoSomethingAsync()在工作線程中調用。回調DoSomething()也在(不同的)工作線程中執行。 – Metro 2010-10-05 19:36:30