c#-访问在运行时创建的任何后台工作程序

场景:我的应用程序中有一个DataGrid,其中在每一行爬行时,将在下面的texbox中填充值.我将更新值,然后单击“保存”,此过程将花费更多时间.

因此,我写了一个后台工作程序来使进程异步运行.当每一行都被单击时,将创建一个背景工作人员实例并完成该过程.在该更新过程中,用户将选择网格的第二行并更新该值.因此,这将创建另一个实例,并且该过程将在后台运行.

现在,当两个更新过程都在运行时,如果用户选择了网格的第一行,则应该显示一条消息,指出“过程仍在运行”.

//码:

‘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存储在列表中以随时引用它们,但也可以创建任务队列并在其中存储任何挂起的进程,因此任何时候您只有一个BackgroundWorker.

将BackgroundWorkers存储在列表中

创建一个List(Of BackgroundWorker),该列​​表可以在代码中需要的任何地方访问.每次创建新的BackgroundWorker时,请将其添加到列表中:

mylist.Add(bw)

您以后有很多选择可以访问正确的backgroundworker.最简单的方法是创建自己的类,该类将具有一个标识符(例如DataGrid的行)和backgroundworker.这样,您的列表将属于此类,而不是BackgroundWorkers:

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

使用队列运行任务

创建一个队列,该队列的类型具有运行任务的信息.例如,DataGrid的行(如果足够的话)将是Integer(索引)类型,然后在每次运行backgroundworker时将其添加:

myQueue.Add(myRow)

每次后台工作人员完成时,请检查队列并运行下一个存储的任务.

上一篇:不能从另一个线程访问对象


下一篇:c#-是从调用线程还是辅助线程调用BackgroundWorker的OnDoWork?