在过去的 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);
}