2012-02-01 21 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(); 

私はこれをInitializeComponent()の後の私のUserControlsのコンストラクタ関数に入れます。

サービスコールがないと、サービスコールが完了するまでアプリケーションが表示されません。これを追加すると、アプリケーションがすぐに表示され、サービスコールが完了したらラベルが表示されるようにすることが、私の希望です。私の驚きには、これは起こらなかった。サービスコールが完了するまで、アプリケーションは表示されません。

これは私の意図したとおりに変更する必要がありますか?

ありがとうございます!

答えて

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

はるかに良い:あなたが欲しい

は長時間実行の仕事、バックUIにその後、通話を行うには、バックグラウンドスレッドです!ありがとう!事実かもしれないが、何が起きているのかを理解したり、理論を確認したりせずに変更を実装したくないという考えは真実でした。助けを感謝します! – Nullqwerty

2

あなたはすぐに(その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(); 
関連する問題