[英]Calling BackgroundWorker synchronously
我想同步調用后台工作程序。 我希望執行代碼在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 i.e. 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
方法中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.