2012-02-01 80 views
0

我有一個用C#編寫的WPF應用程序。它會調用我寫的WCF服務。有時,WCF服務可能需要長達20秒才能返回(取決於是否需要刷新數據)。我知道我可以讓WCF服務支持異步調用,但另一個我認爲可行的解決方案是將調用WCF服務包裝到一個新線程中。我這樣做了以下代碼:線程不會異步

new System.Threading.Thread(
    new System.Threading.ThreadStart(
    delegate() 
    { 
     Action del = delegate() 
     { 
      MyService.MyServiceClient ms = new MyService.MyServiceClient(); 
      lblTotalCost.Text = ms.GetTotalCost().ToString("C"); 
     }; 

     this.Dispatcher.BeginInvoke(del); 
    })).Start(); 

我把它放到我的一個UserControl的構造函數中,在InitializeComponent()之後。

沒有它,在服務調用完成之前,應用程序不會出現。我希望添加這個可以使應用程序立即出現,並且一旦服務調用完成,標籤就會填充。但令我驚訝的是,這並沒有發生。直到服務調用完成後,應用程序纔會出現。

這需要如何修改,以便它做我打算做的事情?

謝謝!

回答

3

使用Dispatcher你把全部工作回到UI線程。我應該在那裏完成lblTotalCost.Text的任務。

MyService.MyServiceClient ms = new MyService.MyServiceClient(); 
var value = ms.GetTotalCost().ToString("C"); 

this.Dispatcher.BeginInvoke(new Action(() => lblTotalCost.Text = value)); 
+0

好多了!謝謝!認爲可能是這種情況,但不想在不理解正在發生的事情或確認理論的情況下實施變革是事實。感謝幫助! – Nullqwerty 2012-02-01 18:35:12

2

你正在創建另一個線程其立即調用返回到您的UI線程來完成實際工作(經由Dispatcher.BeginInvoke調用)。

你想要的是後臺線程做了長時間運行的工作,然後回調到UI:

new System.Threading.Thread(
new System.Threading.ThreadStart(
delegate() 
{ 
    MyService.MyServiceClient ms = new MyService.MyServiceClient(); 
    var v = ms.GetTotalCost(); 
    Action del = delegate() 
    { 
     lblTotalCost.Text = v.ToString("C"); 
    }; 

    this.Dispatcher.BeginInvoke(del); 
})).Start();