【问题标题】:Can MessageBox.Show cause cross-thread exceptions?MessageBox.Show 会导致跨线程异常吗?
【发布时间】:2011-03-24 15:25:22
【问题描述】:

我可以在子线程上调用MessageBox.Show 而不必担心跨线程异常吗?我知道表面上的答案是“尝试并找出答案”,我成功地做到了,但我注意到 Windows 7 在引发跨线程异常方面似乎没有 Windows XP 严格。

那么,它是否记录在任何可以从子线程安全执行的地方?

【问题讨论】:

  • 你到底是什么意思?跨线程异常的来源是什么?
  • AFAIK 跨线程调用异常不依赖于操作系统。它们是以某种方式使用 WinForms API 的记录结果。
  • @Jon,我只是想确保调用 MessageBox.Show 不会像弄乱组合框那样构成 UI 访问。我想不是,但我想确定
  • @Martino,我(愚蠢地)编写了从运行良好的子线程访问 UI 元素的错误代码,直到有人在 Windows XP 上对其进行测试后才将其发回给我。我不知道为什么Win7对此如此宽容,但它是:(
  • 不可能,这是纯 .NET 管道,与操作系统没有任何关系。没有调试器永远不会引发异常。

标签: c# winforms multithreading


【解决方案1】:

如果您在没有所有者窗口的情况下调用MessageBox.Show("text"),您将被保存。 如果您像 MessageBox.Show(this,"text") 一样调用 MessageBox.Show 来指定所有者窗口,情况会有所不同。

我已经看到,在 Windows XP 中您可以保存,但在 Windows 7 中,如果所有者窗口在与您调用 MessageBox 的线程不同的线程中运行,您将遇到跨线程异常!

【讨论】:

  • 我现在看到了 :( 我有一个显示在表单后面的消息框。如果我按照您的说明添加所有者,那么我会得到一个“跨线程操作无效:控制” [我的表单]'从创建它的线程以外的线程访问"
【解决方案2】:

不,它不会导致任何“跨线程”异常。这是因为 MessageBox 不是在 UI 线程上运行的类的成员。

【讨论】:

    【解决方案3】:

    在单独的线程中抛出 MessageBox 是安全的。但请记住,它只会阻塞创建它的线程。如果您使用的是 WinForm 应用程序并且另一个线程调用 MessageBox,那么该表单仍然可以播放并且用户可以忽略它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多