我是C#和WPF的新手,我试图了解 DispatcherTimer 如何与GUI(WPF)协同工作。我想让我的应用程序每2秒运行一个函数,但仍然使用应用程序本身,当我尝试以下代码时,计时器启动但我不能使用以下按钮(注销和退出),它就像应用程序冻结。
public MainLoggedWindow()
{
Globals.mainLoggedWindow = this;
InitializeComponent();
DispatcherTimer dt = new DispatcherTimer();
dt.Tick += new EventHandler(dtTiker);
dt.Interval = new TimeSpan(0, 0, 1);
dt.Start();
}
private void exit_button_Click(object sender, RoutedEventArgs e)
{
logout_button_Click(sender, e);
Environment.Exit(-1);
}
private void logout_button_Click(object sender, RoutedEventArgs e)
{
Globals.LOGGED_IN_USER.logout();
this.Hide();
Globals.mainWindow.Show();
}
private int increment = 0;
private void dtTiker(object sender,EventArgs e)
{
increment++;
Time.Content = increment.ToString();
}
答案 0 :(得分:0)
DispatcherTimer
在UI线程上运行。这意味着当DispatcherTimer
调用其Tick
方法时,UI线程变得忙于处理它,并且它没有时间处理其他UI输入,如按钮点击,因此窗口冻结。
你可以做的是增加DispatcherTimer
的间隔时间 - 你的问题描述是每两秒一次,但你的初始化逻辑每隔一秒就有一次:dt.Interval = new TimeSpan(0, 0, 1);