wpf在presenter(VM)中异步更新viewer中数据

    在MVP或者MVVM模式中,VM和Presenter通过binding与Viewer交换数据。在实际项目中,往往需要动态刷新界面的数据。本人一般通过刷新与之绑定的属性变化完成。但是,如果遇到数据量较大或者更新次数比较频繁的时候,就需要用到异步更新了,下面提供一种比较安全的方法来达到这一目的。
 
 首先定义分发器。它提供管理线程工作项队列的服务
 private readonly Dispatcher _dispatcher = Dispatcher.CurrentDispatcher;
 
 其次定义定时器。

_dataUpdateTimer = new DispatcherTimer();
_dataUpdateTimer.Interval = new TimeSpan(0, 0, 0, 0, 500);
_dataUpdateTimer.Tick += new EventHandler(OnUpdateTimerTick);
记录本线程的ID
_threadId = Thread.CurrentThread.ManagedThreadId;
最后是更新部分,主要功能是完成向界面上的绑定属性赋值为随机的数值
 private readonly Random _random = new Random((int)DateTime.Now.Ticks);
private void OnUpdateTimerTick(object sender, EventArgs e)
{
    if(_threadId == Thread.CurrentThread.ManagedThreadId) return;
    //CheckAccess 方法可以验证是否可以访问该线程;
    //与Winform的时候,常用的SelfSynchronizationContext == SynchronizationContext.Current && InvokeRequired == false 判定差不多
    if (!_dispatcher.CheckAccess())
    {
        _dispatcher.BeginInvoke(new ThreadStart(() =>
        {
           UIValue = _random.NextDouble() * 10000 / DateTime.Now.Millisecond;
        }), null);
        return;
    }
    UIValue = _random.NextDouble() * 10000 / DateTime.Now.Millisecond;
}

posted on 2009-08-21 11:02  oliverPP  阅读(663)  评论(0编辑  收藏  举报

导航