-1

我正在尝试使用MessageBox.Show()方法显示错误消息通知。但是我遇到了跨线程操作问题。我使用了下面的代码。如何解决跨线程问题?我尝试使用MethodInvoker,但它没有解决我的问题。请向我建议解决此问题的指南。

 public static class Notification()
 {

   public static void ShowErrorMessage(IWin32Window owner, String msg)
   {
       MessageBox.Show(owner, msg, Caption+ " - " + "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
   }

}

问题 :

跨线程操作无效:控件“MainPage”从创建它的线程以外的线程访问。

4

2 回答 2

1

这是从另一个线程调用 MessageBox 的完整示例。这里的技巧是将调度程序存放在某个地方(就像其他静态类中的静态变量一样——在这个例子中,我把静态变量放在同一个类中,但你可以把它放在任何地方)然后你让调度程序调用一些在主线程上的调用。您可以同步 (Invoke) 或异步 (BeginInvoke) 来满足您的需求。

static System.Windows.Threading.Dispatcher d; // Save the dispatcher in this global

private void Form1_Load(object sender, EventArgs e)
{
    d = System.Windows.Threading.Dispatcher.CurrentDispatcher;
    System.Threading.Timer t = new System.Threading.Timer((obj) => {
        d.Invoke(() => {
            MessageBox.Show("hi!");
        });
    }, null, 1000, System.Threading.Timeout.Infinite);

}
于 2020-05-28T16:57:15.117 回答
0

似乎这里有答案MessageBox.show() 在工作线程中调用是否不安全?,虽然这个问题有点误导。

此外,此 Microsoft 文档页面详细说明了如何对 WinForm 控件进行线程安全调用,并为您提供代码示例。

于 2020-05-28T16:08:36.330 回答