BackgroundWorker, RunWorkerCompleted事件疑问

ysj837471050 2014-08-29 12:26:11
为什么在RunWorkerCompleted事件中先close的dialog,并不会消失,只有当click弹出的MessagBox 的ok 按钮后,才会消失。
BackgroundWorker backgroundWorker;
Form2 authenticateDialog;
public Form3()
{
InitializeComponent();
backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += new DoWorkEventHandler(DoLogin);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(DoLoginCompleted);
}
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker.RunWorkerAsync();
ShowAuthenticateDialog();

}
protected void DoLogin(object sender, DoWorkEventArgs e)
{
int i=0;
int max=100;
while(i<max)
{
Thread.Sleep(10);
i++;
}

}
protected void DoLoginCompleted(object sender, RunWorkerCompletedEventArgs e)
{
CloseAuthenticateDialog();
MessageBox.Show("OK");

}
private void ShowAuthenticateDialog()
{
authenticateDialog = new Form2();
authenticateDialog.ShowDialog();
}
private void CloseAuthenticateDialog()
{
authenticateDialog.Close();

}
...全文
223 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysj837471050 2014-08-29
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
正常情况下,窗体会对重绘进行优化,如果处于阻塞状态则不重绘,所以明明关闭了窗体,但是并没有消失 加上Application.DoEvents(),强制窗体重绘
加了Application.DoEvents(),就又出现我问的问题了。RunWorkerCompleted事件中先close的dialog,并不会消失,只有当click弹出的MessagBox 的ok 按钮后,才会消失。
ysj837471050 2014-08-29
  • 打赏
  • 举报
回复
引用 3 楼 dongxinxi 的回复:
authenticateDialog.Closed += (obj, eve) => MessageBox.Show("OK"); 你上面的说的是对的,如果你拿spy++看了就会知道,那个阻塞的UI thread block了,并且reason是wait user response 处理UI消息的主线程,虽然之前收到了WM_Close消息,但还未得及处理完就被模态框阻塞了
spy++,听说过,但没用过,抽空看看。谢谢答疑! 想请教一下怎么实现以下的功能。 点击一个按钮,弹出一个进度条窗口,后台执行一个 backgroundworker,在completed事件中去关闭这个进度条窗口后,立即弹出成功提示对话框。现在遇到的问题如题所述。现在的思路,是将显示进度条放在一个单独的线程去做,但是这样做的问题是,显示的进度条窗口不是模式对话框,可以操作父窗体,怎样避免这个问题。
於黾 2014-08-29
  • 打赏
  • 举报
回复
正常情况下,窗体会对重绘进行优化,如果处于阻塞状态则不重绘,所以明明关闭了窗体,但是并没有消失 加上Application.DoEvents(),强制窗体重绘
於黾 2014-08-29
  • 打赏
  • 举报
回复
中间加一句 Application.DoEvents()试试
  • 打赏
  • 举报
回复
authenticateDialog.Closed += (obj, eve) => MessageBox.Show("OK"); 你上面的说的是对的,如果你拿spy++看了就会知道,那个阻塞的UI thread block了,并且reason是wait user response 处理UI消息的主线程,虽然之前收到了WM_Close消息,但还未得及处理完就被模态框阻塞了
ysj837471050 2014-08-29
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:

 CloseAuthenticateDialog();
            this.BeginInvoke(new Action(() =>
            {
                MessageBox.Show("OK");
            }));
感谢回复,我知道有几种方式去实现这种效果。但是如果我在Completed 事件加入Close(); 还没有等到Ok对话框弹出。Form3 就close 掉了。我要得是保持模式对话框保持在UI thread上,这样在我没有点击ok 按钮之前,UI thread 处于阻塞状态,只有我点击ok 按钮之后,forrm3 才关闭。
exception92 2014-08-29
  • 打赏
  • 举报
回复

 CloseAuthenticateDialog();
            this.BeginInvoke(new Action(() =>
            {
                MessageBox.Show("OK");
            }));

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧