WPF / C#任务async for dummies:如何构建简单的UI / BL合作?

时间:2015-08-05 05:50:25

标签: c# wpf user-interface task business-logic

我在线程/背景工作者等几乎完全处女。

我正在尝试这样做:

  1. 新窗口显示进程(标签)的状态并且正在进行中 XAML定义的动画与故事板(三个点代表 背景中的过程)。
  2. 运行一些背景密集型代码,需要一些输入和 没有输出。
  3. 完成后,使用消息
  4. 更新UI
  5. 重复2&每次在后台进行不同操作3次。
  6. 当后台BL正在运行时,我希望UI不要挂起,但继续执行下一个BL方法应该只在第一个BL方法结束后执行并且UI已经用消息更新我想出席。

    我喜欢最苗条,最简单的方法。使用.Net 4.5,所以我相信我们正在谈论任务,对吧?

    我已经阅读了数十篇Stackoverflow文章,并咨询了谷歌和姨妈MSDN,但它的压倒一切 - 有很多方法可以做到这一点,我有点迷失。

    提前致谢。

2 个答案:

答案 0 :(得分:1)

无论您谈论什么,使用async / await都非常简单。既然你说你是多线程的新手,我建议你阅读并熟悉它。这是good startthis

我假设您可以自己实施#1,而您只需要实施休息的指导。所以,我不会在我的帖子中谈论它。

理论上,您需要一个包含工作需求列表的集合,然后在上一个完成后逐个启动。

提供一些代码示例

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是一个包含有关要完成的工作的数据的类。

答案 1 :(得分:-2)

您需要创建一个用于在后台处理数据的线程。您可以使用参数化线程,如果您想在第一次完成后继续第二次执行,请在线程的while lop中设置一个布尔变量,或者编写线程同步。