如何从 .Net 5 Winforms 应用程序访问 Dispatcher

问题描述

如何在 .Net 5.0 应用程序中使用 System.Windows.Threading.dispatcher 类?

根据在线文档,它应该可用。
https://docs.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatcher?view=net-5.0

通常,在 .Net Framework 应用程序中,我只会添加对程序集 WindowsBase.dll 的引用。但由于我使用的是 .Net 5.0 项目,所以我只能引用 Nuget 包。
Cannot add assemblies to .Net Core application in Visual Studio 2019

但是,似乎没有 WindowsBase Nuget 包。
https://www.nuget.org/packages?q=WindowsBase

一个名为 Microsoft.Windows.Compatibility 的包,根据其描述听起来应该包含该类;但它没有。
https://www.nuget.org/packages/Microsoft.Windows.Compatibility/6.0.0-preview.5.21301.5

有什么建议吗?

限制:

  • 该项目广泛使用 WinForms。将其转换为 WPF 是不可行的。
  • 我使用 dispatcher 的原因是,它使不同线程上的对象可以调用对 UI 的修改。创建这些对象时,UI 并不存在,因此无法将控件传递给它们(而且,对于业务对象来说,了解按钮和内容的 IMO 也不是很优雅)。

解决方法

仔细查看后,我意识到截至今天(2021 年 6 月 17 日)Nuget 包Microsoft.Windows.Compatibility 仍处于预发布。这意味着当其他人阅读此线程时,该类可能已经包含在内。

如果没有,我找到了一个解决方法:

  1. 创建 WPF 类库
  2. 添加一个 DispatcherWrapper 类
  3. 添加私有 Dispatcher 属性。
  4. 将所有(需要的)Dispatcher 方法添加到 DispatcherWrapper 类
  5. 将 WinForms 应用中的项目引用添加到 WPF 库。
  6. 使用 DispatcherWrapper 类而不是 Dispatcher。

不过,在阅读了 Jimi 的评论后,我认为在处理 Winforms 应用程序时,使用 SynchronizationContext 而不是 Dispatcher 会更优雅。 >