C# 使用Dispatcher取消阻止Wpf Ui
我正在使用windows应用程序,它可以生成各种测试结果。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
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());