c# - 在 MT 环境中使用 .Net Core 为桌面应用程序提高属性更改的推荐方法是什么
问题描述
在过去的 10 年中,我将 WPF 与“Dispatcher”一起使用,以确保 UI 线程能够接收通知。我在基础“模型”类中使用这样的代码:
[NotifyPropertyChangedInvocator]
public void RaisePropertyChanged([CallerMemberName] String propertyName = "")
{
var propertyChanged = PropertyChanged;
if (propertyChanged != null)
{
if (Dispatcher == null) // For console App
{
propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
else
{
if (Dispatcher.CheckAccess())
{
propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
else
{
Dispatcher.Invoke(new Action(() => propertyChanged(this, new PropertyChangedEventArgs(propertyName))));
}
}
}
}
在这个SO Question中,一些人谈论 AsynContext,另一个人似乎添加了 nuget 包“Microsoft.NET.Sdk.WindowsDesktop”,这似乎依赖于 Windows 操作系统。
在新的桌面应用程序中执行等效操作的推荐方法是什么?调度员在哪里?有没有等价的?我们可以保持我们的代码操作系统独立吗?我们是否应该再等几个月,直到微软推出独立于操作系统的解决方案?
解决方案
WPF 仍然只在 Windows 上运行,并且Dispatcher
仍然存在,所以你的问题有点不清楚。
如果您正在开发一个类库以供在不同平台上运行的不同客户端应用程序使用,您可以隐藏Dispatcher
一个接口,然后在每个支持的客户端平台中实现该接口。
界面:
public interface IDispatcher
{
bool CheckAccess();
void Invoke(Action action);
}
查看型号:
public ViewModel(IDispatch dispatcher) { ... }
WPF 实现:
public class WpfDispatcher : IDispatcher
{
private readonly Dispatcher _dispatcher;
public WpfDispatcher(Dispatcher dispatcher) =>
_dispatcher = dispatcher;
public bool CheckAccess() => _dispatcher.CheckAccess();
public void Invoke(Action action) => _dispatcher.Invoke(action);
}
推荐阅读
- android - Flutter 错误:无法从 /android/gradle/wrapper/gradle-wrapper.properties' 加载包装器属性
- node.js - Node Js安装错误,启动npm时出错
- c - 在 Xcode 中显示时间
- docker - 无法连接到 Kubernetes - 配置无效
- javascript - 从 Reactjs 中的文件导出数据
- javascript - NATS 与分子。如何更改 NATS max_payload 值?
- reactjs - 从 GitHub 目录部署一个 react 应用程序到 netlify
- ansible - 如何在我的集合的根目录上运行 ansible-test?
- c - C中字符串从大写变为小写时堆溢出[leetcode]
- android - 无法从 Android 写入 Firebase 实时数据库