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;
}
首先定义分发器。它提供管理线程工作项队列的服务
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;
}