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