WPF 应用程序启动时都会加载两个重要的线程:一个用于呈现用户界面,另一个用于管理用户界面。呈现线程是一个在后台运行的隐藏线程,因此您通常面对的唯一线程就是 UI 线程。WPF 要求将其大多数对象与 UI 线程进行关联。这称之为线程关联,意味着要使用一个 WPF 对象,只能在创建它的线程上使用。在其他线程上使用它会导致引发运行时异常。
。net的定时器有很多种
1、Timer
新开一个线程,当直接操作UI线程的控件时会抛出异常: 调用线程无法访问此对象,因为另一个线程拥有该对象
正确的方式:
View Code
using System; using System.Windows; using System.Timers; using System.Windows.Threading; namespace TimerTest { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { private Timer aTimer = null; private delegate void TimerDispatcherDelegate(); public MainWindow() { InitializeComponent(); aTimer = new Timer(1000); aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); aTimer.Interval = 1000; aTimer.Enabled = true; } private void OnTimedEvent(object sender, EventArgs e) { this.Dispatcher.Invoke(DispatcherPriority.Normal, new TimerDispatcherDelegate(updateUI)); } private void updateUI() { timeLabel.Content = DateTime.Now.ToUniversalTime(); } } }
2、DispatcherTimer
dispatcherTimer是在UI线程中调用的,可以直接访问UI线程控件
View Code
_dtSwitch = new DispatcherTimer(); //创建刷新 _dtSwitch.Tick += new EventHandler(dt_Switch); //设置刷新时间 double interval = 30; _dtSwitch.Interval = TimeSpan.FromSeconds(interval); //开始计时 _dtSwitch.Start();
销毁:
View Code
private void TailorBasePage_Unloaded(object sender, RoutedEventArgs e) { if (_dtSwitch == null) { return; } _dtSwitch.Tick -= dt_Switch; _dtSwitch.Stop(); _dtSwitch.IsEnabled = false; _dtSwitch = null; GC.Collect(); }

浙公网安备 33010602011771号