需要为长时间运行的工作提供模式或解决方案,该工作在循环中执行,并在每个线程完成后更新UI

本文关键字:工作 执行 线程 更新 UI 循环 运行 长时间 解决方案 模式 | 更新日期: 2023-09-27 18:16:45

我有一个基本的场景,我需要完成一个任务列表,其中UI在每个任务之后更新,并且任务必须按顺序执行。

我有一个WPF应用程序,需要处理n个对指定数据库的请求,并且在每个任务之后,我需要使用任务的结果更新应用程序。

foreach(var task in tasks)
{
   // create thread for task to hit a database
   // update ui with result from the task
}

如果我这样做没有线程,UI不会更新,直到所有任务完成,应用程序冻结,直到每个任务完成。

UI将在数据网格中添加一行,显示在数据库上执行的每个"任务"的结果。

谢谢,

bmm

需要为长时间运行的工作提供模式或解决方案,该工作在循环中执行,并在每个线程完成后更新UI

带有进度报告的BackgroundWorker将完全做到这一点。您可以在UserState属性中包含任何您需要的内容,并将其应用于ProgressChanged事件处理程序。

您可以使用新的Task类,它具有方便的ContinueWith方法,该方法允许您在当前任务完成后将更多工作排队。见:http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx。

因此,您可以实现如下流:
  1. 用初始动作实例化任务
  2. 继续更新GUI
  3. 继续下一个任务
  4. 返回步骤2

你也可以使用ThreadPool

下面是一个例子。

      ThreadPool.QueueUserWorkItem(delegate
        {
            //Do something
            //Update ui.
            TextBox.Dispather.Invoke((Action)(() =>
            {
                //Update the control
            }));
        });