等待Dispatcher.BeginInvoke时阻止我的UI线程...(使用WPF和WCF)

时间:2014-02-04 22:59:31

标签: c# wpf multithreading wcf tap

我有一个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
    //...
}

1 个答案:

答案 0 :(得分:0)

Dispatcher.BeginInvoke()通常被视为一种执行异步操作的方式,其好处是不必创建/涉及另一个线程。

但这意味着它只对小型轻量级工作有益。这里最好的事情是将调用推送到PTProgressUpdateInThread()到ThreadPool。或者使用带螺纹的计时器 无论如何,你都没有在await之后使用结果。