最好的处理方法是将长时间运行的进程放在后台线程上。可以使用
BackgroundWorker
来实现,这是我在Windows应用程序中选择的类。为什么?因为当通过它报告进度(例如更改按钮状态)时,它会自动处理线程切换到UI线程。
以下是一个示例,说明它的工作原理。假设您有一个
BackgroundWorker
的私有类字段:
private BackgroundWorker _worker = new BackgroundWorker();
在构造函数中,我们需要设置一些东西:
_worker.WorkerReportsProgress = true;
_worker.DoWork += DoWork;
_worker.ProgressChanged += ProgressChanged;
_worker.RunWorkerCompleted += RunWorkerCompleted;
好的,现在设置处理程序:
private void DoWork(object sender, DoWorkEventArgs e)
{
}
private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
}
private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
最后,要运行后台进程,只需执行以下操作:
_worker.RunWorkerAsync();
当需要报告进度时,在DoWork
处理程序中执行以下操作:
// NOTE: make sure to pass AT LEAST a value of 1 for the percentage
// or the event handler will NEVER fire. Further, someValue can be anything
// an instance of an object with data or just a string, or nothing for that
// matter - it's up to you
_worker.ReportProgress(1, someValue);