【问题标题】:Is it safe to instantiate a form and call ShowDialog from within BeginInvoke?从 BeginInvoke 中实例化表单并调用 ShowDialog 是否安全?
【发布时间】:2013-08-06 01:21:18
【问题描述】:

实例化表单并从 BeginInvoke 中调用 ShowDialog 是否安全?

BeginInvoke 在创建控件的同一线程上运行任务。 所以据我所知应该没问题...

我只是想问这样的创建是否会导致一些挂起、死锁等。

【问题讨论】:

  • 更准确地说:来自 BeginInvoke 调用的函数。是的,它是安全的。

标签: c# .net


【解决方案1】:

这是模棱两可的,肯定听起来像你先实例化表单然后调用 BeginInvoke()。不,那好。 看起来 就像它会工作一样,因为 ShowDialog() 会泵出一个消息循环。但是你会有很多非常讨厌的故障。温和的东西是窗口不是应用程序中其他窗口的模态。并且与您的应用程序中的其他窗口没有 Z 顺序关系,这可能会导致它很容易地消失在另一个窗口后面。更糟糕的是该线程可能不是 STA 线程,诸如拖放、剪贴板和外壳对话框之类的东西将不起作用。 真正令人讨厌的事情是让 SystemEvents 类开始在错误的线程上触发事件,这个问题会持续到对话框之后,然后在不可预知的时间崩溃或挂起你的应用程序。

只在 UI 线程上创建表单实例。这意味着您必须使用表单的 另一个 实例的 BeginInvoke() 方法,该实例是之前创建的。如果您急于找到一个,那么 Application.OpenForms[0] 可能会给您一个。

【讨论】:

  • 不不,我在BeginInvoke里面实例化了表单,里面也调用了ShowDialog。 BeginInvoke 是从主 UI 控件执行的,所以在那个场景中应该可以吗? :)
  • 是的,没关系,正如我所描述的那样。
【解决方案2】:

在 BeginInvoke 中调用 ShowDialog 是否安全,如果从后台线程调用 ShowDialog 将是一个问题。

【讨论】:

  • 除非您打错字,否则您的第一句话只是重复问题?第二个是对一个没有被问到的问题的回答
猜你喜欢
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多