在 MT 环境中使用 .Net Core 引发桌面应用程序的属性更改的推荐方法是什么?



在过去的 10 年里,我一直将 WPF 与"调度程序"一起使用,以确保 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问题中,一些人谈论AsynContext,另一个似乎添加了nuget包"Microsoft.NET.Sdk.WindowsDesktop",它似乎依赖于Windows操作系统。

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

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

相关内容

  • 没有找到相关文章

最新更新