将 Application.Run() 放在与初始线程不同的线程中是不是会产生后果?

Posted

技术标签:

【中文标题】将 Application.Run() 放在与初始线程不同的线程中是不是会产生后果?【英文标题】:Are there consequences to putting Application.Run() in a different Thread than the initial one?将 Application.Run() 放在与初始线程不同的线程中是否会产生后果? 【发布时间】:2021-11-22 20:24:50 【问题描述】:

我目前正在尝试将 .NET 通用主机内容与 WinForms 结合起来,并且正在尝试类似这样的东西:

var mainmenu = new Thread(() => Application.Run(_mainMenuView as Form));
mainmenu.SetApartmentState(ApartmentState.STA);
mainmenu.Start();

_mainMenuView 是我从 DI yadayadayada 获得的 MainMenuView 表单实现的接口。

我现在的问题是:

这会产生不可预见的后果吗? 我需要将线程重新加入我的“主”线程吗? 如果我只是关闭窗体,线程会死吗? 通过界面获取或设置属性有多安全?我需要关心 Invocation 吗?

感谢您的帮助

【问题讨论】:

这就像你在主线程运行它然后从另一个线程访问表单一样。因此,例如所有 UI 交互都应该通过调度程序(Invoke)。 我这样做是为了在应用程序启动期间显示启动画面而没有任何问题(已经这样做了十多年,所以我现在可能已经注意到任何问题了!)。然而,闪屏的作用并不大,用户交互也很少,所以 YMMV。 【参考方案1】:

我也一直在尝试这个。你可以在另一个线程上运行Application.Run

我需要将线程重新加入我的“主”线程吗? 通过界面获取或设置属性有多安全?我需要关心 Invocation 吗?

如果您想从与运行 application.run 的线程不同的线程中设置任何属性。你应该关心锁定。

如果我只是关闭窗体,线程会死吗?

当您关闭表单时,线程将结束。

这会产生不可预见的后果吗?

您将面临的一个问题是,Application 类使用静态属性/方法。因此,当您尝试使用 application.run 创建多个线程时,您可能会遇到奇怪的行为。

【讨论】:

这很有用。你能详细说明一下锁定吗?我以前见过关键字'lock',但还没有使用它。应用程序是静态的也是我担心的问题,但我还没有看到任何奇怪的东西,你有什么建议我应该采取的预防措施吗? 这里有一些信息:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…

以上是关于将 Application.Run() 放在与初始线程不同的线程中是不是会产生后果?的主要内容,如果未能解决你的问题,请参考以下文章

在 WinForms 应用程序中使用 WPF,将应用程序资源放在哪里?

Application.Run 用于宏返回数组

Application.run 不适用于模块

Application.Run(form) 永远不会返回(使用 System::Management 之后)

Application.Run 是我的应用程序中最消耗 CPU 的函数;我可以优化啥?

可以“分拆”几个 GUI 线程吗? (不会在 Application.Run 中停止系统)