调度wcf模型 - 添加方法

时间:2011-12-13 15:30:15

标签: c# wpf dispatcher

抱歉,我仍然不了解用户界面的工作方式以及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;
}

1 个答案:

答案 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线程上运行。