场景:我的应用程序中有一个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)
每次后台工作人员完成时,请检查队列并运行下一个存储的任务.