对于我的桌面应用程序,我实现了一个自定义进度条,可以异步执行长时间运行的任务(当然也会报告进度)。
我的主应用程序调用(简化):
myForm aProgress = new myForm(<some_params>);
aProgress.ShowDialog();
表单的构造函数(简化):
BackgroundWorker myWorker = new BackgroundWorker();
myWorker.DoWork += new DoWorkEventHandler(<some_async_stuff>);
和form的加载事件处理程序:
myWorker.RunWorkerAsync();
在此过程中, some_async_stuff 需要显示MessageBox并等待用户响应(是/否)。 Invoke用于强制 MessageBox在前面的显示进度条:
if ((DialogResult)Invoke((Func<DialogResult>)(() => { return MessageBox.Show("question", "caption", MessageBoxButtons.YesNo); })) == DialogResult.No)
<something>;
else
<something_else>;
问题:
在大多数情况下,一切(包括MessageBox和用户的响应)都按预期工作。但是有时候MessageBox根本就不会出现,但是应用程序正在等待用户的响应(当然是无限期的)。
此行为难以可靠地重现,偶尔会发生。 有任何想法或类似经历吗?
提前致谢。