抱歉,我仍然不了解用户界面的工作方式以及Dispatcher
我有DispatchingWcfModel
:
public interface IWcfModel
{
List<ConsoleData> DataList { get; set; }
event Action<List<ConsoleData>> DataArrived;
}
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;
}
现在我要添加int[] ConnectionStats { get; set; }
。我应该为它介绍单独的活动吗?我应该在DispatchingWcfModel中写什么?我希望有这样的界面:
public interface IWcfModel
{
List<ConsoleData> DataList { get; set; }
int[] ConnectionStats { get; set; }
event Action<List<ConsoleData>> DataArrived;
}
答案 0 :(得分:0)
Dispatcher
是WPF的主UI线程的内部消息队列。它可以从其他线程用于在应用程序的主UI线程上运行命令。
这很重要,因为WPF不允许您访问在其他线程上创建的对象。例如,如果在主UI线程上创建了Button,则无法从另一个线程修改此按钮,但您可以使用另一个线程的Dispatcher将命令发送到主UI线程以更新按钮。
这适用于所有对象,而不仅仅是UI元素。如果在一个线程上创建类似ObservableCollection
的东西,则另一个线程无法修改它。因此,所有对象通常都在主UI线程上创建。
可以同步或异步处理调度程序消息,它们可以具有不同的优先级。在您的代码中,您使用的是_currentDispatcher.BeginInvoke(DispatcherPriority.DataBind, dispatchAction);
,这意味着它将开始与主UI线程进行异步操作,并以与DataBinding相同的优先级运行它。您可以在DispatcherPriorities
here上查看更多信息。
如果您的ConnectionStats
集合以异步方式获取其数据,那么您将需要添加某种DataArrived方法,该方法将从非UI线程获取数据并将其添加到集合中。如果获取并打包数据,则可以使用现有的DataArrived方法,如果单独获取数据,则可以创建自己的数据。如果它同步得到它的数据,你不需要做任何特别的事情。
从事物的外观来看,_underlying_DataArrived
意味着在后台线程上运行(意味着它不能改变你的集合,应该在主UI线程上创建),而DataArrived
是意味着在主UI线程上运行。