WPF/C#傻瓜式任务异步:如何建立简单的UI/BL合作?
WPF/C# task async for dummies: How to build a simple UI/BL cooperation?
我在线程/后台工作者等方面几乎完全是处女
我正在尝试这样做:
- 新 window 显示进程(标签)的状态并且有一个正在进行的
XAML-定义带有故事板的动画(三个点代表
后台进程)。
- 运行 一些后台密集型代码,需要一些输入和
returns无输出。
- 完成后,用消息更新 UI
- 重复2&3数十次,每次后台操作不同
虽然后台BL正在运行我希望UI不要挂起,但是下一个BL方法的继续执行应该只在第一个结束并且UI 已更新为我要呈现的消息。
我想要最简洁、最简单的方法。使用 .Net 4.5,所以我相信我们正在谈论任务,对吧?
我已经阅读了数十篇 Whosebug 文章并咨询了叔叔 google 和阿姨 MSDN,但它是压倒性的 - 有很多方法可以做到这一点,我有点迷茫。
提前致谢。
您需要创建一个线程来在后台处理数据。您可以使用参数化线程,如果您只想在第一次执行完成后继续第二次执行,请在线程的 while lop 中设置一个布尔变量或写入线程同步。
无论您在说什么,async/await 都非常简单。既然你说你是多线程的新手,我建议你阅读并熟悉它。这是一个good start and this
我假设您可以自己实施#1,并且您只需要在实施 rest 方面得到指导。所以,我不会在 post.
中谈论它
理论上你需要一个需要完成的工作列表的集合,然后在上一个完成后开始一个一个地开始。
给出一些代码示例
List<WorkItem> workItems = ...;//Populate it somehow
private async Task DoWorkMain()
{
foreach (var item in workItems)
{
await DoWork(item);
//WorkItem completed, Update the UI here,
//Code here runs in UI thread given that you called the method from UI
}
}
private Task DoWork(WorkItem item)
{
//Implement your logic non blocking
}
然后从 UI 的某处调用
await DoWorkMain();
WorkItem
是一个 class,其中包含有关要完成的工作的数据。
我在线程/后台工作者等方面几乎完全是处女
我正在尝试这样做:
- 新 window 显示进程(标签)的状态并且有一个正在进行的 XAML-定义带有故事板的动画(三个点代表 后台进程)。
- 运行 一些后台密集型代码,需要一些输入和 returns无输出。
- 完成后,用消息更新 UI
- 重复2&3数十次,每次后台操作不同
虽然后台BL正在运行我希望UI不要挂起,但是下一个BL方法的继续执行应该只在第一个结束并且UI 已更新为我要呈现的消息。
我想要最简洁、最简单的方法。使用 .Net 4.5,所以我相信我们正在谈论任务,对吧?
我已经阅读了数十篇 Whosebug 文章并咨询了叔叔 google 和阿姨 MSDN,但它是压倒性的 - 有很多方法可以做到这一点,我有点迷茫。
提前致谢。
您需要创建一个线程来在后台处理数据。您可以使用参数化线程,如果您只想在第一次执行完成后继续第二次执行,请在线程的 while lop 中设置一个布尔变量或写入线程同步。
无论您在说什么,async/await 都非常简单。既然你说你是多线程的新手,我建议你阅读并熟悉它。这是一个good start and this
我假设您可以自己实施#1,并且您只需要在实施 rest 方面得到指导。所以,我不会在 post.
中谈论它理论上你需要一个需要完成的工作列表的集合,然后在上一个完成后开始一个一个地开始。
给出一些代码示例
List<WorkItem> workItems = ...;//Populate it somehow
private async Task DoWorkMain()
{
foreach (var item in workItems)
{
await DoWork(item);
//WorkItem completed, Update the UI here,
//Code here runs in UI thread given that you called the method from UI
}
}
private Task DoWork(WorkItem item)
{
//Implement your logic non blocking
}
然后从 UI 的某处调用
await DoWorkMain();
WorkItem
是一个 class,其中包含有关要完成的工作的数据。