场景:我的应用程序中有一个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/