如何使用BackgroundWorker事件RunWorkerCompleted
总之,我已经知道BackgroundWorker
在WinForm中处理multithreading案例的基本用法。 代码结构如下所示。
在应用程序的主线程中。 刚刚启动BackgroundWork。
if (backgroundWorker1.IsBusy != true) { // Start the asynchronous operation. backgroundWorker1.RunWorkerAsync(); }
然后它会触发DoWork
事件。 所以我们可以在那里做点什么。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; ...... // report progress. worker.ReportProgress(iProgress); .... }
然后我们只需要处理ProgressChanged
事件以显示BackgroundWorker进度。
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { //show progress. resultLabel.Text = (e.ProgressPercentage.ToString() + "%"); }
DoWork
完成或发生exception后。 将触发RunWorkerCompleted
事件。
这是我对这个事件处理的问题。 请帮助审查它们。 谢谢。
我注意到RunWorkerCompletedEventArgs e
有一个名为’Result’的属性,它用于什么? 我怎么用呢?
是否有可能接收我的自定义exception消息而不是e.error
? 如果有,如何制作?
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled == true) { resultLabel.Text = "Canceled!"; } else if (e.Error != null) { resultLabel.Text = "Error: " + e.Error.Message; } else { resultLabel.Text = e.Result.ToString(); } }
RunWorkerCompletedEventArgs
的Result
属性是您在DoWork()
分配给DoWorkEventHandler
的Result属性的DoWorkEventHandler
。
您可以为此分配任何您喜欢的内容,因此可以返回整数,字符串,对象/复合类型等。
如果在DoWork()
抛出exception,则可以在RunWorkerCompletedEventArgs
的Error
属性中访问exception。 在这种情况下,访问Result属性将导致抛出TargetInvocationException
。
public class MyWorkerClass { private string _errorMessage = ""; public string ErrorMessage { get { return _errorMessage; } set { _errorMessage = value; }} public void RunStuff(object sender, DoWorkEventArgs e) { //... put some code here and fill ErrorMessage whenever you want } }
然后是你使用它的类
public class MyClassUsingWorker { // have reference to the class where the worker will be running private MyWorkerClass mwc = null; // run the worker public void RunMyWorker() { mwc = new MyWorkerClass(); BackgroundWorker backgroundWorker1 = new BackgroundWorker(); backgroundWorker1.DoWork += new DoWorkEventHandler(mwc.RunStuff); backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); backgroundWorker1.RunWorkerAsync(); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { string strSpecialMessage = mwc.ErrorMessage; if (e.Cancelled == true) { resultLabel.Text = "Canceled!"; } else if (e.Error != null) { resultLabel.Text = "Error: " + e.Error.Message; } else { resultLabel.Text = e.Result.ToString(); } } }
您可以使用Result属性存储DoWork的任何结果,并从Completed事件中访问它。 但是如果后台工作进程被取消或引发exception,则无法访问结果。 你会在这里找到更多细节。