我正在使用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 await
。 getdata
类位于differentnet名称空间中,方法getsummary
在该空间中定义。
主要目标是取消阻止UI以及如何使用Dispatcher技术解决这个问题?
答案 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);