[英]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.