gpt4 book ai didi

c# - 什么时候在 mvvm 中使用 Dispatcher?

转载 作者:行者123 更新时间:2023-12-03 10:30:04 24 4
gpt4 key购买 nike

在 Jason Dolinger 视频之后,我创建了装饰普通模型的 DispatchingWcfModel。但我不明白我为什么需要它。我应该总是使用某种调度模型吗?如果我将使用普通模型而不是调度模型怎么办?为什么我需要“调度员”?

class DispatchingWcfModel : IWcfModel
{

private readonly IWcfModel _underlying;
private readonly Dispatcher _currentDispatcher;

public DispatchingWcfModel(IWcfModel model)
{
_currentDispatcher = Dispatcher.CurrentDispatcher;
_underlying = model;
_underlying.DataArrived += _underlying_DataArrived;
}

private void _underlying_DataArrived(List<ConsoleData> obj)
{
Action dispatchAction = () =>
{
if (DataArrived != null)
{
DataArrived(obj);
}
};
_currentDispatcher.BeginInvoke(DispatcherPriority.DataBind, dispatchAction);
}

public List<ConsoleData> DataList
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}

public event Action<List<ConsoleData>> DataArrived;
}

最佳答案

TL;DR: DispatchingWcfModel类总结注入(inject)IWcfModel并保证当新数据到来时 - 更改将以安全的方式发送到 UI 事件 IWcfModel.DataArrived事件已在后台线程中引发,所以 DispatchingWcfModel总是使用 Dispatcher 将回调推送到 UI 线程。

更详细:在您的示例中 DispatchingWcfModel订阅注入(inject)事件的类 IWcfModel , 所以当事件被引发时 - 事件处理程序 _underlying_DataArrived会叫什么最重要的一点 - 它将在实际引发事件的线程上调用,因此调用线程可能不是 UI 线程,因此对 UI 控件的任何更改都将失败,以避免使用此 Dispatched。

在 WPF 中,当您需要更新 UI 元素时,Dispatcher 很有用,因此这应该在 UI 线程中完成。正确的方法 - 将这项工作委托(delegate)给 Dispatcher,它坚持应该在 UIThread 上执行的工作项(请求)队列。

MSDN :

In WPF, a DispatcherObject can only be accessed by the Dispatcher it is associated with. For example, a background thread cannot update the contents of a Button that is associated with the Dispatcher on the UI thread. In order for the background thread to access the Content property of the Button, the background thread must delegate the work to the Dispatcher associated with the UI thread. This is accomplished by using either Invoke or BeginInvoke. Invoke is synchronous and BeginInvoke is asynchronous. The operation is added to the queue of the Dispatcher at the specified DispatcherPriority.

关于c# - 什么时候在 mvvm 中使用 Dispatcher?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8296291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com