使用Dispatcher取消阻止Wpf Ui

时间:2014-06-20 22:24:33

标签: c# wpf dispatcher event-dispatch-thread

我正在使用Windows应用程序生成各种测试结果。 UI提供了一个按钮Results,它具有各种方法作为事件处理程序。这些方法由API模块提供。该模块从仓库中提取数据,然后将其显示给用户。 API调用是异步的。

但点击按钮后,UI会被阻止。 经过一些阅读后,我才知道Dispatcher有助于在后台运行一个进程。 Dispatcher只能由UI线程调用/调用。 如何实施调度程序以防止UI被阻止?

c#中的函数看起来像这样

private async void get_results(object sender, RoutedEventArgs e)
{
      List<resultsummary> data = new List<resultsummary>();
      if(id==plan_id)
        {
           data= await getdata.getsummary(id, name);
         }           
} 

编辑: -

这是我对上述代码中异步和等待的理解。但它给出了错误cannot awaitgetdata类位于differentnet名称空间中,方法getsummary在该空间中定义。

主要目标是取消阻止UI以及如何使用Dispatcher技术解决这个问题?

2 个答案:

答案 0 :(得分:1)

您无需使用Dispatcher来执行您想要的操作。为了在后台线程上获取数据,然后将该数据从后台线程传递到UI线程,您可以使用Task class

Task.Factory.StartNew((Func<YourDataType>)delegate()
{
    // Fetch data on background thread here (return YourDataType, whatever that is)
    return DataAccessClass.GetData();
}).ContinueWith((Task<YourDataType> task) =>
{
    // Update controls with result on UI thread here
    YourUiProperty = task.Result;
}, TaskScheduler.FromCurrentSynchronizationContext());

显然,您需要将YourDataType类型替换为您的数据类型。

答案 1 :(得分:0)

您可以使用Action ...

将您的代码放入Action这样的“

Action action = () =>
{
    // your code...
};

假设您有一个显示结果的标签

myLabel.Dispatcher.BeginInvoke(action);