我有一个WPF窗口,可以在其构造函数中创建并启动计时器。 timer elapsed事件触发一个方法(SyncPTUpdate),它使用BeginInvoke将另一个方法(PTProgressUpdateInThread)的调用放到Window的线程上。然后,它会异步调用WCF调用(使用由VS 2013自动生成的TAP模式)。
当我人为地长时间进行WCF调用时(使用服务器组件中的thread.sleep),我的WPF应用程序的UI冻结了。不是最初,但几秒钟过去了。
我哪里错了?
public delegate void PTProgressDelegate();
// this method is called from a periodically firing timer (System.Timers)
private async void SyncPTUpdate(object sender, ElapsedEventArgs e)
{
await this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new PTProgressDelegate(PTProgressUpdateInThread));
}
private async void PTProgressUpdateInThread()
{
PTMapFieldClient = new FieldClient();
ServiceField.BlokPTProgress PTProgressFromServer = await PTMapFieldClient.GetPTProgressAsync(variousparametershere);
PTMapFieldClient.Close();
// now use the results of the WCF call to update the Window UI
//...
}
答案 0 :(得分:0)
Dispatcher.BeginInvoke()
通常被视为一种执行异步操作的方式,其好处是不必创建/涉及另一个线程。
但这意味着它只对小型轻量级工作有益。这里最好的事情是将调用推送到PTProgressUpdateInThread()到ThreadPool。或者使用带螺纹的计时器
无论如何,你都没有在await
之后使用结果。