如何在.NET 5 WinForms应用中使用System.Windows.Threading.Dispatcher
方案1:使用SynchronizationContext(推荐)
这是适配你需求的最优解,无额外依赖,完全满足解耦要求,是.NET官方提供的跨线程UI调度通用实现:
- 首先在UI线程初始化阶段(项目
Program.cs的Main方法中,主窗体创建前)捕获当前UI线程的同步上下文,存储到公共可访问的位置:
// Program.cs 代码示例 namespace YourAppNamespace { static class Program { // 全局存储UI线程同步上下文 public static SynchronizationContext UiSynchronizationContext { get; private set; } [STAThread] static void Main() { Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // 捕获UI线程同步上下文 UiSynchronizationContext = SynchronizationContext.Current; Application.Run(new MainForm()); } } }
- 业务代码需要跨线程执行UI相关操作时,直接调用预存的同步上下文的
Post(异步执行,不阻塞当前线程)或Send(同步执行,阻塞当前线程)方法即可,不需要传递任何UI控件实例,业务层与UI层完全解耦:
// 业务代码中调用示例 Program.UiSynchronizationContext.Post(state => { // 此处代码会自动调度到UI线程执行 // 可直接执行更新UI、触发UI层订阅事件等操作 }, null);
方案2:强制使用Dispatcher类的处理方式
如果你确实需要使用System.Windows.Threading.Dispatcher,不需要额外安装NuGet包,直接修改项目配置即可:
打开你的项目.csproj文件,添加WPF框架引用(仅引入程序集,不需要将现有WinForms代码迁移到WPF):
<Project Sdk="Microsoft.NET.Sdk.Desktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net5.0-windows</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <!-- 添加此行启用WPF程序集引用,自动包含WindowsBase --> <UseWPF>true</UseWPF> </PropertyGroup> </Project>
保存配置后重新加载项目,即可正常使用Dispatcher类。
内容的提问来源于stack exchange,提问作者Cesar Coll
相关产品推荐
相关产品推荐

