在C#/WPF中,如何让来自线程的MessageBox显示得像来自主线程一样?

5

有一个线程可能会抛出异常,当发生异常时,会被捕获,显示一个特定的消息框,然后关闭软件。

但是问题在于,由于这不是程序的主线程,在显示消息框时,程序窗口仍然处于空闲状态,用户可以与其交互。它不会锁定屏幕,就像在主窗口上方显示消息框时那样。我想避免这种情况。

我想知道最好的方法是什么。到目前为止,我考虑使用某种线程通信(从未在C#中使用过)来从主线程中引发消息框。

引发线程:

Thread thread = new Thread(new ThreadStart(MyClass.MyMethod));
thread.IsBackground = true;
thread.Start();

MyMethod的各个部分都捕获了异常。自程序启动以来,它是一个不停循环运行的线程。异常的原因可能是网络错误。


2
你是如何管理线程的(例如 ThreadBackgroundWorker)?异常可能在哪里被引发?请发布代码片段以描述当前的工作方式。 - Mike Perrenoud
也许这可以帮助你:http://msdn.microsoft.com/library/zyzhdc6b(v=vs.110).aspx - Sascha
1
@MichaelPerrenoud 这是一个线程,我添加了进一步的解释。 - André Santaló
2个回答

12

您可能只需在 Dispatcher 上调用它:

Application.Current.Dispatcher.Invoke(() => MessageBox.Show(...));

这是一个WPF应用程序,而不是Winform应用程序。 - Servy
1
或者使用BeginInvoke()来进行异步操作。 - Matt
2
我现在使用了以下代码进行测试:Application.Current.Dispatcher.Invoke(new Action(() => MessageBox.Show("Error")));,但不幸的是,它没有“锁定”屏幕。编辑:现在它可以工作了,我只是在调试时搞错了什么。谢谢! - André Santaló
3
注意可能存在一种重入危险:如果在显示MessageBox时可能发生这样的异常(因为会创建一个嵌套的消息循环),那么您可能会最终显示多个消息框。我曾经在应用程序中看到过这种情况,结果并不美观:有时会创建无穷无尽的新MessageBox对话框。请小心。(注:此提示不是针对特定答案,而是针对问题本身。) - Mike Strobel
1
在.NET 3.5中似乎不存在"Application.Current" - 是否有替代方法? - jocull


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接