我有一个用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的构造函数中。
没有它,在服务调用完成之前,应用程序不会出现。我希望添加它会使应用程序立即显示,并且一旦服务调用完成,标签就会填充。令我惊讶的是,这并没有发生。在服务调用完成之前,应用程序仍然不会出现。
如何对其进行修改以使其按照我的意图进行操作?
谢谢!
答案 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();