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