110,532
社区成员
发帖
与我相关
我的任务
分享
//声明的部分
private ManualResetEvent m_ResetEvent = new ManualResetEvent(false);
private bool m_bgw1Finish=false;
private bool m_bgw2Finish=false ;
private bool m_bgw3Finish=false ;
....
....
//开始进程的代码
private void button3_Click(object sender, EventArgs e)
{
m_ResetEvent.Reset();
m_bgw1Finish = false;
m_bgw2Finish = false;
m_bgw3Finish = false;
bgw1.RunWorkerAsync();
Thread.Sleep(10);
bgw2.RunWorkerAsync();
Thread.Sleep(10);
bgw3.RunWorkerAsync();
Thread.Sleep(10);
//MessageBox.Show("all finished");
if (m_ResetEvent.WaitOne( ))
{
MessageBox.Show("all finished");
}
}
//我在每个进程结束的事件里面都写了相应的代码
private void bgw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
m_bgw1Finish = true;
if (m_bgw1Finish || m_bgw2Finish || m_bgw3Finish)
{
// MessageBox.Show("all finished");
m_ResetEvent.Set() ;
}
}
private void button3_Click(object sender, EventArgs e)
{
bgw1.RunWorkerAsync();
Thread.Sleep(10);
bgw2.RunWorkerAsync();
Thread.Sleep(10);
bgw3.RunWorkerAsync();
Thread.Sleep(10);
while (bgw1.IsBusy && bgw2.IsBusy && bgw3.IsBusy)
{
// Console.WriteLine ("hello");
}
MessageBox.Show("all finished"); //好像进了死循环,一直看不到这里。
}
#if 方式1
ManuResetEvent _CEvent= new ...;
#endif
bool _IsBgw1Complete;
bool _IsBgw2Complete;
bool _IsBgw3Complete;
private void button3_Click(object sender, EventArgs e)
{
#if 方式1
CEvent.Reset();
#endif
_IsBgw1Complete=false;
_IsBgw2Complete=false;
_IsBgw3Complete=false;
bgw1.RunWorkerAsync();
bgw2.RunWorkerAsync();
bgw3.RunWorkerAsync();
#if 方式1
//方式1:系统需要等待所有采集线程完成,则可设置一个ManuResetEvent,在
if( _CEvent.WaitOne(可以设置等待的超时))
{
DoAfterCollect()
}
else
{
//超时失败的处理
}
#else
//方式2: 不阻塞,直接关闭,界面可以直接处理其他事务,而在所有采集工作完成后,自动弹出后续操作需要的窗体。因此直接结束即可
#endif
}
private void bgw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
_IsBgw1Complete=true;
if (_IsBgw1Complete && _IsBgw2Complete&& _IsBgw3Complete)
{
#if 方式1
_CEvent.Set();
#else
//方式2,
DoAfterCollect();
#endif
}
}
private void DoAfterCollect()
{
// Console.WriteLine ("hello");
}
while (bgw1.IsBusy && bgw2.IsBusy && bgw3.IsBusy)
{
// Console.WriteLine ("hello");
application.doevents();
}
MessageBox.Show("all finished");
private void button3_Click(object sender, EventArgs e)
{
bgw1.RunWorkerAsync();
Thread.Sleep(10);
bgw2.RunWorkerAsync();
Thread.Sleep(10);
bgw3.RunWorkerAsync();
Thread.Sleep(10);
while (bgw1.IsBusy && bgw2.IsBusy && bgw3.IsBusy)
{
// Console.WriteLine ("hello");
}
MessageBox.Show("all finished"); //好像进了死循环,一直看不到这里。
}
#region 异步回调
private void button5_Click(object sender, EventArgs e)
{
EventHandler p = new EventHandler(button2);
p.BeginInvoke(sender, e, new AsyncCallback(CallBackMth), null);
}
void CallBackMth(IAsyncResult target)
{
//后续操作....
}
#endregion