WPF/C#面向傻瓜的任务异步:如何构建简单的UI/BL协作?

WPF/C#面向傻瓜的任务异步:如何构建简单的UI/BL协作?,c#,wpf,user-interface,task,business-logic,C#,Wpf,User Interface,Task,Business Logic,我在线程/后台工作等方面几乎完全是处女 我正在尝试这样做: 新窗口显示进程(标签)的状态,并具有正在进行的 XAML定义的带有故事板的动画(三个点代表 后台处理) 运行一些后台密集型代码,这需要一些输入和 不返回任何输出 完成后,使用消息更新UI 每次在后台用不同的操作重复2&3次数十次 当后台BL运行时,我希望UI不要挂起,但是下一个BL方法的继续执行应该只在第一个BL方法结束并且UI已经用我想要呈现的消息更新之后执行 我想要最苗条、最简单的方法。使用.NET4.5,所以我相信我们讨论的是任务

我在线程/后台工作等方面几乎完全是处女

我正在尝试这样做:

  • 新窗口显示进程(标签)的状态,并具有正在进行的 XAML定义的带有故事板的动画(三个点代表 后台处理)
  • 运行一些后台密集型代码,这需要一些输入和 不返回任何输出
  • 完成后,使用消息更新UI
  • 每次在后台用不同的操作重复2&3次数十次
  • 当后台BL运行时,我希望UI不要挂起,但是下一个BL方法的继续执行应该只在第一个BL方法结束并且UI已经用我想要呈现的消息更新之后执行

    我想要最苗条、最简单的方法。使用.NET4.5,所以我相信我们讨论的是任务,对吗

    我已经阅读了几十篇Stackoverflow文章,并咨询了谷歌叔叔和MSDN婶婶,但这是压倒性的——有很多方法可以做到这一点,我有点不知所措


    提前感谢。

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

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

    无论您谈论什么,使用async/await都相当简单。既然您说您是多线程新手,我建议您阅读并熟悉它。这是一个和

    我假设您可以自己实现#1,您只需要在实现rest时获得指导。所以,我不会在我的帖子中谈论它

    从理论上讲,你需要一个包含需要完成的工作列表的集合,然后在前一个集合完成后逐个开始

    给出一些代码示例

    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
    }
    

    WorkItem
    是一个类,它保存有关要完成的工作的数据。

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

    我假设您可以自己实现#1,您只需要在实现rest时获得指导。所以,我不会在我的帖子中谈论它

    从理论上讲,你需要一个包含需要完成的工作列表的集合,然后在前一个集合完成后逐个开始

    给出一些代码示例

    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
    }
    

    WorkItem
    是一个类,它保存有关要完成的工作的数据。

    请看投票关闭的部分是否太宽。您应该自己选择方法,并在此处询问详细信息。我推荐斯蒂芬·克利里的这个系列:这绝对是一个很好的起点,作者是
    async
    /
    wait
    genius。看一看,投票结束的文章太宽泛了。您应该自己选择方法,并在此处询问详细信息。我推荐斯蒂芬·克利里的这个系列:这绝对是一个很好的起点,作者是
    async
    /
    wait
    genius。创建线程是个坏主意。自从
    ThreadPool
    发明以来,在大多数情况下不需要手动管理线程。自从发布了TPL(尤其是
    async
    /
    await
    ),就不需要直接处理
    ThreadPool
    。创建线程是个坏主意。自从
    ThreadPool
    发明以来,在大多数情况下不需要手动管理线程。自从TPL(尤其是
    async
    /
    wait
    )发布以来,就没有必要直接处理
    线程池了。谢谢,@Sriram Sakthivel。这就是我要求的总体方向。你能详细说明一下工作项目清单吗//以某种方式填充它
    ?例如?@zazkapulsk您需要向列表中添加一些工作项,以便执行它。i、 使用您需要工作的参数<代码>工作项。添加(新工作项(您的参数1,参数2))。我希望您的程序中有要完成的工作列表,这就是
    list workItems
    谢谢。就这样。我真的很感激。嗯,@Sriram Sakthivel-我在DoWork方法中得到一个错误:“不是所有的代码路径都返回一个值”。应该返回什么?@zazkapulsk阅读我提供的链接,了解如何使用async/await。如果将
    DoWork
    实现为异步方法,则不需要返回任何内容,但内部应该有一个wait关键字。了解如何处理任务和TPL。谢谢,@Sriram Sakthivel。这就是我要求的总体方向。你能详细说明一下工作项目清单吗//以某种方式填充它?例如?@zazkapulsk您需要向列表中添加一些工作项,以便执行它。i、 使用您需要工作的参数<代码>工作项。添加(新工作项(您的参数1,参数2))。我希望您的程序中有要完成的工作列表,这就是
    list workItems
    谢谢。就这样。我真的很感激。嗯,@Sriram Sakthivel-我在DoWork方法中得到一个错误:“不是所有的代码路径都返回一个值”。应该返回什么?@zazkapulsk阅读我提供的链接,了解如何使用async/await。如果将
    DoWork
    实现为异步方法,则不需要返回任何内容,但内部应该有一个wait关键字。了解如何处理任务和TPL。