在过去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 OS。
在新的桌面应用程序中,推荐的等效方法是什么?调度员在哪里?有什么等效的吗?我们可以保持代码操作系统独立吗?我们是否应该再等几个月才能让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);
}