如何从异步任务中有效地更新WPF主窗口
本文关键字:更新 WPF 窗口 有效地 异步 任务 | 更新日期: 2023-09-27 18:19:11
使用从public static class
抛出的事件从async task
更新WPF MainWindow是一种可接受的方法吗?
在MainWindow.cs中,我订阅UI.TaskCompleted
事件在美国,我订阅AsyncTaskActions.TaskCompleted
事件。
使用此模式,当异步任务完成时引发AsyncTaskActions.TaskCompleted
。UI捕获事件并引发UI.TaskCompleted
。这样,在MainWindow代码中捕获事件,我可以使用Displacher.Invoke
来刷新显示的页面。最终结果是,当任务完成并且任务仍然运行asynchronously
时,我获得页面刷新。
应用程序设计总结:
MainWindow:主窗口,可以有几个不同的页面类在主窗口的内容区
cs的公共静态类包含了一些通用的方法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技巧。