[英]How to efficently update WPF MainWindow from an async task
这是使用从public static class
引发的事件从async task
更新WPF MainWindow的可接受方法吗?
在MainWindow.cs中,我订阅UI.TaskCompleted
事件。在UI.cs中,我订阅AsyncTaskActions.TaskCompleted
事件。
使用此模式,将在完成异步任务后引发AsyncTaskActions.TaskCompleted
。 UI捕获事件并引发UI.TaskCompleted
。 这样,在MainWindow代码中捕获了事件,在这里我可以使用Displacher.Invoke
刷新显示的页面。 最终结果是,当任务完成并且任务仍asynchronously
运行时,我将刷新页面。
应用程序设计摘要:
MainWindow:主窗口,在主窗口的内容区域中可以具有几个不同的页面类。
Common.cs公共静态类通过应用程序中的UI包含许多常用方法。
AsyncTaskActions.cs-具有许多
async
常用方法的类(即下载文件)
代码段:
public partial class MainWindow
public MainWindow()
{
UI.TaskCompleted += UI_TaskCompleted;
}
void UI_TaskCompleted(EventArgs e)
{
Dispatcher.Invoke(new Action(this.PageRefresh));
}
public void PageRefresh()
{
var page = ((ContentArea)).Content;
if (page == null) return;
switch (page.GetType().Name)
{
case "SearchPage":
((SearchPage) page).SearchParts();
break;
case "LegoPartPage":
((LegoPartPage) page).LoadData();
break;
case "LegoSetPage":
((LegoSetPage) page).LoadData();
break;
case "MainPage":
((MainPage) page).LoadData();
break;
case "MiniFigPage":
((MiniFigPage) page).LoadData();
break;
}
}
}
public static class UI
{
public delegate void TaskComplete(EventArgs e);
public static event TaskComplete TaskCompleted;
public static async Task<int> DownloadPriceSummaryAsync(String itemNo, Int64 colorId)
{
var wAsyncTaskClasses = new AsyncTaskClasses();
wAsyncTaskClasses.TaskCompleted += wAsyncTaskClasses_TaskCompleted;
Task<HtmlDocument> task = wAsyncTaskClasses.DownloadPriceGuide(string.Format(Common.BrickLinkPrice, itemNo, colorId), itemNo, colorId);
return await wAsyncTaskClasses.ParsePriceSummaryAsync(task, itemNo, colorId);
}
}
public class AsyncTaskActions
{
public delegate void TaskComplete(object sender, EventArgs e);
public event TaskComplete TaskCompleted;
public async Task<int> ParsePriceSummaryAsync(Task<HtmlDocument> task, string itemNo, Int64 colorId)
{
return await Task.Run(() => ParsePriceSummary(task, itemNo, colorId));
}
public int ParsePriceSummary(Task<HtmlDocument> task, string itemNo, Int64 colorId)
{
... some code....
if (null != TaskCompleted)
{
TaskCompleted(this, new EventArgs());
}
return recordCount;
}
您正在使用Dispatcher.BeginInvoke
将所有事件编组到UI上下文中,这看起来很安全。
和往常一样, 如果有效,就可以!
顺便说一句-我个人认为这种设计没有太多可以接受的。 假设您来自程序或功能背景是否合理? 将其扔给Code Review以获得更多信息和一些OO技巧可能会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.