使用从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;
}
答案 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处抛出此内容。