问题描述
如何在 .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 仍处于预发布。这意味着当其他人阅读此线程时,该类可能已经包含在内。
如果没有,我找到了一个解决方法:
- 创建 WPF 类库
- 添加一个 DispatcherWrapper 类
- 添加私有 Dispatcher 属性。
- 将所有(需要的)Dispatcher 方法添加到 DispatcherWrapper 类
- 将 WinForms 应用中的项目引用添加到 WPF 库。
- 使用 DispatcherWrapper 类而不是 Dispatcher。
不过,在阅读了 Jimi 的评论后,我认为在处理 Winforms 应用程序时,使用 SynchronizationContext 而不是 Dispatcher 会更优雅。 >