首页 > 解决方案 > 在 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 操作系统。

在新的桌面应用程序中执行等效操作的推荐方法是什么?调度员在哪里?有没有等价的?我们可以保持我们的代码操作系统独立吗?我们是否应该再等几个月,直到微软推出独立于操作系统的解决方案?

标签: c#wpfinotifypropertychangeddispatcheros-dependent

解决方案


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);
}

推荐阅读