所有 WinForms 应用程序 windows 是否共享同一个线程?

Do all the WinForms application windows share the same thread?

我的一个 WinForms 应用程序不会在启动时立即执行 Application.Run(Form)

它首先初始化一些变量,访问命令行参数、应用程序配置 API、其他外部内容,特别是表单(例如登录表单)实例化(并通过传递一些配置之前设置的值)用 using 并用 ShowDialog.

显示

然后执行Application.Run(Form)来显示主窗体,但主窗体也可以依次显示其他窗体(主要是ShowDialog)。所有表单都在单独的 class 库中定义。其中许多(windows)需要访问在 Program.Main(string[] args) 中实例化的对象(是的,我已经添加了 string[] args 部分,尽管使用 Visual Studio 创建的 WinForms 应用程序没有默认情况下)并将对象传递给彼此;

这让我担心线程安全,但我对 "UI thread" 概念的基本想法表明我的担心可能是错误的。

因此,由同一 WinForms 应用程序进程实例化和显示的所有 windows(Form 实例)是否共享相同的 UI 线程(除非我将代码 instantiating/showing 他们在一个异步 运行 Task 或类似的当然明确地)?或者我真的应该使用一些特殊的技术(具体建议表示赞赏)来安全地在它们之间传递数据?

回答您的问题有点困难,因为总有可能“...但我在这里和那里创建了一些线程...”潜伏着您没有告诉我们。

但是,除此之外,是的。 Winforms 应用程序将为其用户界面和所有周围代码使用 1 个线程。

请注意,如果您开始处理以下问题:

  • Task.Run
  • 线程class
  • 后台工作者

然后我的回答就出来了window。