同步调用BackgroundWorker

我想同步调用后台工作程序。 我希望在backgroundworker完成执行时执行代码。 我的BackgroundWorker代码在这里:

{ BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += DoWork; worker.RunWorkerCompleted += RunWorkerCompleted; ... worker.RunWorkerAsync(); //wait for execution to end } 

一种方法是再次检查状态,直到执行完成,但有没有其他好方法呢?

如果您不希望代码异步执行,请不要将其放在BackgroundWorker

 { DoWork(); } 

但是,如果您确实需要在BackgroundWorker中使用代码有一些不明确的原因,则可以使用以下命令:

 ManualResetEvent mre = new ManualResetEvent(false); BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += DoWork; worker.RunWorkerCompleted += (s, e) => { RunWorkerCompleted(s, e); mre.Set(); }; // ... worker.RunWorkerAsync(); mre.WaitOne(); 

目标: BackgroundWorker应该同步执行。

创建了一个Windows应用程序表单。 单击button1时,它应该同步执行BackgroundWorker并返回参与UI,因此用户在完成BackgroundWorker任务之前无法执行任何操作。

 public partial class Form1 : Form { public Form1() { InitializeComponent(); } BGimplent obj = null; private void button1_Click(object sender, EventArgs e) { int i = 0; obj = new BGimplent(); obj.eveBG += obj_eveBG; i = 5; obj.MyProperty = 5; obj.DoConfig(); obj.ManualReset.WaitOne(); obj.MyProperty = 10; obj.MyProperty = 11; obj.MyProperty = 12; obj.MyProperty = 13; obj.MyProperty = 14; } void obj_eveBG(string s) { obj.ManualReset.Set(); MessageBox.Show(s); } } /* ******************************************************* Paste below code in adding new class ie Class1 */ public delegate void delBG(string s); class BGimplent { public event delBG eveBG; private ManualResetEvent mnuReset = new ManualResetEvent(false); public ManualResetEvent ManualReset { get; set; } public int MyProperty { get; set; } BackgroundWorker bgWorker = new BackgroundWorker(); public void DoConfig() { ManualReset = mnuReset; bgWorker.DoWork += bgWorker_DoWork; bgWorker.ProgressChanged += bgWorker_ProgressChanged; bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted; bgWorker.RunWorkerAsync(); } void bgWorker_DoWork(object sender, DoWorkEventArgs e) { Thread.Sleep(5000); if (eveBG != null) eveBG("Value of MyProperty: " + MyProperty.ToString()); } } 

//wait for execution to end后的代码应放在worker_RunWorkerCompleted方法中。