BackgroundWorker 更适合长时间运行的任务,您需要类似ThreadPool 的东西。这是一个非常粗略的例子:
QueueUserWorkItem 允许您指定一个工作方法并传入一个对象以供该方法使用。
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), object);
然后你就会有你的 DoWork 方法,所有的魔法都会发生:
public void DoWork(object sender)
{
object s = (object)sender;
this.Invoke(new ThreadDone(ReportProgress), result);
}
注意对this.Invoke(new TaskDone(ReportProgress)); 的调用,这会安全地调用在主线程上运行的代码,以使用来自DoWork 的已处理数据更新您的UI。这是通过私人委托完成的:
private delegate void ThreadDone(object yourObject);
会调用:
private void ReportProgress(object yourObject)
{
//update UI
}
您还可以通过跟踪 Interlocked 计数器对象来检查任务何时完成,例如
foreach (string s in strings)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), s);
Interlocked.Increment(ref workItems);
}
然后在单个线程完成时递减workItems,并简单检查何时workItems == 0
Interlocked.Decrement(ref workItems);
if (workItems == 0)
{
this.Invoke(new TaskDone(WorkComplete));
}
希望这会有所帮助。