你会在一个单独的线程中运行长时间运行过程中对用户界面,以防止它挂,也许BackgroundWorker
将被用于例如: -
bgWorker.RunWorkerAsync([DATA TO PROCESS])//Passing in data to operate on
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
MyObject obj = (MyObject)sender;
//
// Do some work with the data on the server
//
// Report on progess, is it done?
bgWorker.ReportProgress();
}
你也可以有一个完整的工作方法
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Work is complete, notify user
}
你也可以使用ThreadPool,这需要更多的设置,但我觉得更灵活。例如: -
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), [DATA TO PROCESS]);
Interlocked.Increment(ref workItems);
工作项是项目数的计数留下来处理,这可以用于跟踪的任务是否完成与否。然后我们定义一个DoWork
方法来处理数据并减少我们的工作计数器。一旦项目已被处理,我们通过与会代表汇报工作进度,如: -
private delegate void ThreadDone(MyObject obj);
private delegate void TaskDone();
public void DoWork(object sender)
{
MyObject obj = (MyObject)sender;
this.Invoke(new ThreadDone(ReportProgress), result);
Interlocked.Decrement(ref workItems);
if (workItems == 0)
{
this.Invoke(new TaskDone(WorkComplete));
}
}
报告进展情况可能是这样的: -
private void ReportProgress(MyObject obj)
{
if (workItems >= 0)
{
//Job isn't complete, report progress
}
}
private void WorkComplete()
{
}
嗨,DGibbs,非常感谢你帮助我通过,它帮助我很多。我将进一步探讨这一点。欢呼:) – Learner 2013-03-12 13:13:32
Downvoter care to comment? – DGibbs 2013-03-12 17:20:39