我对BackGroundWorker RunWorkerCompleted
事件执行时间感到困惑。
这是我的测试代码
private string hellow="hello";
private void button1_Click(object sender, EventArgs e)
{
bool createAndRunWorkResult = CreateAndRunWork();
if (createAndRunWorkResult)
{
//Do something that need wait RunBackGroundWorkerCompleted execute here.
//MessageBox.Show(hello);
}
}
private bool CreateAndRunWork()
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync();
return true;
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
//Nothing here;
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
hello="aloha";
}
我的设计工作流程是单击button1,然后在RunWorkerCompleted执行后执行某些操作。
但RunWorkerCompleted似乎位于方法堆栈的底部。换句话说:我在createAndRunWorkResult
执行之前获得RunWorkerCompleted
。令我困惑的是,如果我在button1_Click中取消注释MessageBox.Show(hello)
,MessageBox.Show(hello)
将等到worker_RunWorkerCompleted
执行完毕。但是,我仍然得到一个"你好"消息框而不是" aloha"。
我猜所有的UI操作都位于方法堆栈的RunWorkerCompleted
下面。
但是,我不确定我的假设是否正确,是否有办法在RunWorkerCompleted
被执行后强制执行某些操作?
答案 0 :(得分:2)
问题是,一个backgroudnworker是另一个你不能等待的线程。 后台工作人员告诉你它何时完成了它的工作。 所以你的代码应该是这样的
private string hellow="hello";
private void button1_Click(object sender, EventArgs e)
{
bool createAndRunWorkResult = CreateAndRunWork();
}
private bool CreateAndRunWork()
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync();
return true;
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
//Nothing here;
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
hellow="aloha";
//Do something that need wait RunBackGroundWorkerCompleted execute here.
//MessageBox.Show(hellow);
}
我建议您阅读:http://msdn.microsoft.com/en-us/library/ms173178%28v=vs.120%29.aspx 关于线程
答案 1 :(得分:1)
BackgroundWorker对象旨在简单地在不同的线程上运行一个函数,然后在完成后调用UI线程上的事件,因此在您的代码中,您应该在RunWorkerCompleted之后调用要运行的函数。 / p>
有3个步骤:
告诉BackgroundWorker对象在后台线程(DoWork函数)上运行什么任务。
告诉它在工作完成后在UI线程上运行什么功能(RunWorkerCompleted功能)。
如果您在代码中编写函数调用
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Test();//This is the code which in your case you want to run
}
void Test()
{
hello = "Hola";
MessageBox.Show(hello);
}
您将收到HOLA消息,这是由于上面提到的第3步。希望这有帮助