【问题标题】:How to access Dispatcher from a .Net 5 Winforms app如何从 .Net 5 Winforms 应用程序访问 Dispatcher
【发布时间】:2021-06-17 17:56:06
【问题描述】:

如何在 .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 也不是很优雅)。

【问题讨论】:

  • 您可以使用Progress<T> 代表。或SynchronizationContext.Post()。或者使用 async/await 模式,当可用时(或当你使其可用时)。还有其他同步方法。您不需要 WinForms 中的 WPF Dispatcher。
  • 听起来是个好主意。谢谢,吉米。

标签: winforms .net-5 dispatcher .net-framework-version


【解决方案1】:

仔细查看后,我意识到截至今天(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 更优雅。 p>

【讨论】:

  • 首选 Progress&lt;T&gt; 动作代表。该类已经为您捕获了 UI Thread SynchronizationContext,它使用起来非常简单,并且在大多数情况下都能很好地工作。
  • 无论如何,请在此处查看不同的实现:How to avoid cross-thread operation not valid exception in Winform service bus message receiver。它包括您应该阅读的有关 WPF Dispatcher 的说明。
  • 我也会看看它们。我只是想为实际问题“如何从 .Net 5 Winforms 应用程序访问 Dispatcher”添加一个答案,以防其他人真的需要这样做。
  • 这就像在 WPF 中尝试使用 WinForm 的BeginInvoke()。是否有意义? WPF 是否缺少一些需要来自另一个平台框架(或相反)的方法的功能?不是真的。
  • 是的,我明白了。但是,AFAIK Dispatcher 也存在于 WinForms 上(甚至在 WPF 发布之前?)。它不是 WPF 独有的。现在我正在将一个庞大的系统移植到 Net 5,我的首要任务是一切正常,引入尽可能少的更改。 Dispatcher 在我的课程中被广泛使用,所以现在,我宁愿使用包装器。我可以想象还有其他人处于我同样的境地。也就是说,我非常感谢您向我展示了正确的方法,并且它应该很快就会在我的积压中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多