簡體   English   中英

如何從異步任務有效地更新WPF MainWindow

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM