如何从异步任务中有效地更新WPF MainWindow

时间:2015-10-26 11:00:01

标签: c# wpf async-await dispatcher

使用从async task抛出的事件,这是从public static class更新WPF MainWindow的可接受方法吗?

在MainWindow.cs中,我订阅UI.TaskCompleted事件   在UI.cs中,我订阅了AsyncTaskActions.TaskCompleted事件。

使用此模式,引发AsyncTaskActions.TaskCompleted并完成异步任务。 UI捕获事件并引发UI.TaskCompleted。这样,事件就是MainWindow代码中的catch,我可以使用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;
    }

1 个答案:

答案 0 :(得分:1)

您正在使用<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="0.2" android:text="fdsfdsfds" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="0.8" /> 将所有事件编组到UI上下文中,这似乎是安全的。

像往常一样,如果有效,它就有效!

顺便一提 - 我个人认为这个设计并不多见。假设您来自程序或功能背景,这是否合理?如果需要更多信息和一些OO提示,可能会在Code Review处抛出此内容。