wpf中的DispatcherTimer基本用法,本文不在敘述。主要寫一些不同的,來提醒自己不要再犯同樣錯誤。 前幾天寫代碼時發現。當在非UI線程創建DispatcherTimer實例時,程式無法進入Tick事件 在DispatcherTimer_Click函數入口設斷點,發現程式無法進入。 如果這 ...
wpf中的DispatcherTimer基本用法,本文不在敘述。主要寫一些不同的,來提醒自己不要再犯同樣錯誤。
前幾天寫代碼時發現。當在非UI線程創建DispatcherTimer實例時,程式無法進入Tick事件
private static System.Windows.Threading.DispatcherTimer timer;
private void Button_Click(object sender, RoutedEventArgs e)
{
new System.Threading.Thread(CreateTimer).Start();
}
private void CreateTimer()
{
timer = new System.Windows.Threading.DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += DispatcherTimer_Click;
timer.Start();
}
private void DispatcherTimer_Click(object sender, EventArgs e)
{
Console.WriteLine("DispatcherTimer_Click");
}
在DispatcherTimer_Click函數入口設斷點,發現程式無法進入。
如果這樣創建對象
private static System.Windows.Threading.DispatcherTimer timer;
private void Button_Click(object sender, RoutedEventArgs e)
{
new System.Threading.Thread(CreateTimer).Start();
}
private void CreateTimer()
{
timer = new System.Windows.Threading.DispatcherTimer(System.Windows.Threading.DispatcherPriority.SystemIdle, this.Dispatcher);
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += DispatcherTimer_Click;
timer.Start();
}
private void DispatcherTimer_Click(object sender, EventArgs e)
{
Console.WriteLine("DispatcherTimer_Click");
}
程式可以進入Tick事件。
或者這樣創建對象
private static System.Windows.Threading.DispatcherTimer timer;
private void Button_Click(object sender, RoutedEventArgs e)
{
new System.Threading.Thread(CreateTimer).Start();
}
private void CreateTimer()
{
this.Dispatcher.Invoke(() =>
{
timer = new System.Windows.Threading.DispatcherTimer();
});
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += DispatcherTimer_Click;
timer.Start();
}
private void DispatcherTimer_Click(object sender, EventArgs e)
{
Console.WriteLine("DispatcherTimer_Click");
}
原因如下
DispatcherTimer.Tick 集成到按指定時間間隔和指定優先順序處理的 Dispatcher 隊列中的計時器。
線上程中創建DispatcherTimer對象時,DispatcherTimer的Dispatcher是線程的Dispatcher。
而此時如果線程如果沒有操作UI對象,則其Dispatcher==null,詳情見博客