C# 使用Dispatcher取消阻止Wpf Ui

C# 使用Dispatcher取消阻止Wpf Ui,c#,wpf,dispatcher,event-dispatch-thread,C#,Wpf,Dispatcher,Event Dispatch Thread,我正在使用windows应用程序,它可以生成各种测试结果。UI提供了一个按钮Results,它有多种方法作为事件处理程序。这些方法由API模块提供。该模块从仓库中获取数据,然后将其显示给用户。 API调用是异步的 但一旦单击按钮,UI就会被阻止。 在阅读了相当多的资料之后,我才知道Dispatcher在后台帮助运行进程。Dispatcher只能由UI线程调用。 如何实现dispatcher以避免UI被阻止 c#中的函数类似于 private async void get_results(obje

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

但一旦单击按钮,UI就会被阻止。 在阅读了相当多的资料之后,我才知道Dispatcher在后台帮助运行进程。Dispatcher只能由UI线程调用。 如何实现dispatcher以避免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);
         }           
} 
private async void get_results(对象发送方,RoutedEventArgs e)
{
列表数据=新列表();
如果(id==计划id)
{
data=wait getdata.getsummary(id,name);
}           
} 
编辑:-

这是我在上述代码中对async和Wait的理解。但是它给出了一个错误
不能等待
getdata
类位于不同的名称空间中,方法
getsummary
在该空间中定义


主要目标是解除对UI的阻塞,以及如何使用Dispatcher技术来实现这一点

您可以使用
操作

将代码放入
操作中,如下所示“

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

myLabel.Dispatcher.BeginInvoke(action);

您不需要使用
调度程序来执行所需的操作。为了在后台线程上获取数据,然后将该数据从后台线程传递到UI线程,您可以使用

Task.Factory.StartNew((Func)delegate()
{
//在这里获取后台线程上的数据(返回您的数据类型,不管是什么)
返回DataAccessClass.GetData();
}).ContinueWith((任务)=>
{
//在此处使用UI线程上的结果更新控件
YourUiProperty=task.Result;
},TaskScheduler.FromCurrentSynchronizationContext());

显然,你需要用你的数据类型替换你的数据类型。

+1@HighCore。再一次……热爱你的工作。+1.同样值得一提的是,使用C#5的
异步/等待
特性,这段代码非常优雅和漂亮。是的,我认为还不是每个人都使用.NET 4.5,而且……嗯。…我想我只是在晚年变得懒惰了…现在是午夜。但是,是的,这是正确的观点,提到得很好。
myLabel.Dispatcher.BeginInvoke(action);
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());