从BeginInvoke中实例化窗体并调用ShowDialog是否安全

本文关键字:调用 ShowDialog 是否 安全 窗体 BeginInvoke 实例化 | 更新日期: 2023-09-27 18:26:24

从BeginInvoke中实例化窗体并调用ShowDialog是否安全?

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

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

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

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

从BeginInvoke中实例化窗体并调用ShowDialog是否安全

在BeginInvoke内部调用ShowDialog是否安全,如果从后台线程调用ShowDialogs则会有问题。