线程不能异步执行

时间:2012-02-01 16:46:38

标签: c# wpf multithreading wcf web-services

我有一个用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的构造函数中。

没有它,在服务调用完成之前,应用程序不会出现。我希望添加它会使应用程序立即显示,并且一旦服务调用完成,标签就会填充。令我惊讶的是,这并没有发生。在服务调用完成之前,应用程序仍然不会出现。

如何对其进行修改以使其按照我的意图进行操作?

谢谢!

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:2)

您正在创建另一个线程,该线程立即回调您的UI线程以执行实际工作(通过Dispatcher.BeginInvoke调用)。

你想要的是后台线程做长期工作, 然后 回调用户界面:

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();