c# - 访问在运行时创建的任何后台 worker

标签 c# .net multithreading winforms backgroundworker

场景:我的应用程序中有一个DataGrid,其中onclikcing每一行,值被填充到texboxes 下面。我将更新这些值,当单击“保存”时,该过程需要更多时间才能完成。

所以我写了一个后台程序来使进程运行异步。当点击每一行时,一个 backgroundworker 的实例被创建并且该过程完成。在该更新期间,用户将选择网格的第二行并更新该值。所以这将创建另一个实例,该进程将在后台运行。

现在,当两个更新进程都在运行时,如果用户选择了网格的第一行,应该会有一条消息显示“进程仍在运行”。

//代码:

'事件的OnClick

         var bw = new BackgroundWorker();
          bw.WorkerReportsProgress = true;
          bw.DoWork += delegate {
              SaveDetails();
          };
          bw.RunWorkerCompleted += delegate {
              MessageBox.Show("Completed");
          };
          bw.RunWorkerAsync();

'保存方法

 public void SaveDetails()
    {
        for (int i = 0; i < 10;i++ )
        {
            System.Threading.Thread.Sleep(5000);
            MessageBox.Show("Hi");

        }
    }

我如何访问之前创建的 backgroundworker 实例并检查进程的状态并显示消息?

注意:可能有很多进程同时运行,所以我应该能够访问任何进程。

这可能吗?

最佳答案

您可以将您创建的任何 BackgrounWorker 存储在 List 中以随时引用它们,但您也可以创建一个任务 Queue并将任何待处理的进程存储在那里,因此您在任何时候都只有一个 BackgroundWorker

将 BackgroundWorker 存储在列表中

创建一个 List(Of BackgroundWorker),例如,您可以在代码中需要的任何地方访问它。每次创建新的 BackgroundWorker 时,将其添加到 List 中:

mylist.Add(bw)

稍后您可以通过多种方式访问​​正确的 backgroundworker。最简单的方法是创建您自己的类,该类将具有标识符(例如 DataGrid 的行)和 backgroundworker。这样,您的 list 将属于此类而不是 BackgroundWorkers:

myClass.BackgroundWorkerProperty = bw
myClass.id = myId
myList.Add(myClass)

使用队列来运行任务

创建一个Queue,其类型包含运行任务的信息。例如,DataGrid 的行,如果足够,将类型为 Integer(索引),然后在每次 backgroundworker 时添加它正在运行:

myQueue.Add(myRow)

每次 backgroundworker 完成时,检查 Queue 并运行存储的下一个任务。

关于c# - 访问在运行时创建的任何后台 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18587923/

相关文章:

c# - 各种 Microsoft.CodeQuality.* 分析器之间有什么区别?

java - 将 ThreadLocal 传播到从 ExecutorService 获取的新线程

c# - 为什么 BackgroundWorker 的 ProgressChanged 事件在不调用 RunWorkerAsync 的情况下工作?

c# - 将 SQL Server 文件流与 LINQ 结合使用

c# - 如何使用C#获取Excel中当前打开的文档?

multithreading - 并行过滤惰性序列

c++ - 浏览器中的多线程 WebAssembly 比单线程慢,为什么?

c# - 如何检查字符是否为整数

C# EF 5.0 向 MySQL 数据库添加百万条记录需要数小时

.net - "An attempt was made to load a program with an incorrect format"即使平台相同