【发布时间】:2013-08-06 01:21:18
【问题描述】:
实例化表单并从 BeginInvoke 中调用 ShowDialog 是否安全?
BeginInvoke 在创建控件的同一线程上运行任务。 所以据我所知应该没问题...
我只是想问这样的创建是否会导致一些挂起、死锁等。
【问题讨论】:
-
更准确地说:来自 BeginInvoke 调用的函数。是的,它是安全的。
实例化表单并从 BeginInvoke 中调用 ShowDialog 是否安全?
BeginInvoke 在创建控件的同一线程上运行任务。 所以据我所知应该没问题...
我只是想问这样的创建是否会导致一些挂起、死锁等。
【问题讨论】:
这是模棱两可的,肯定听起来像你先实例化表单然后调用 BeginInvoke()。不,那不好。 看起来 就像它会工作一样,因为 ShowDialog() 会泵出一个消息循环。但是你会有很多非常讨厌的故障。温和的东西是窗口不是应用程序中其他窗口的模态。并且与您的应用程序中的其他窗口没有 Z 顺序关系,这可能会导致它很容易地消失在另一个窗口后面。更糟糕的是该线程可能不是 STA 线程,诸如拖放、剪贴板和外壳对话框之类的东西将不起作用。 真正令人讨厌的事情是让 SystemEvents 类开始在错误的线程上触发事件,这个问题会持续到对话框之后,然后在不可预知的时间崩溃或挂起你的应用程序。
只在 UI 线程上创建表单实例。这意味着您必须使用表单的 另一个 实例的 BeginInvoke() 方法,该实例是之前创建的。如果您急于找到一个,那么 Application.OpenForms[0] 可能会给您一个。
【讨论】:
在 BeginInvoke 中调用 ShowDialog 是否安全,如果从后台线程调用 ShowDialog 将是一个问题。
【讨论】: