在这段代码中,我的用户界面死机了,并且没有更新,尽管控制台写线工作得很好,所以我确定它正在按照我的意愿通过循环
while (true)
{
MyMethod();
}
void MyMethod() {
Console.WriteLine(DateTime.Now);
TimeSpan duration = SetDate - DateTime.Now;
int days = duration.Days + 1;
string strDays = days.ToString();
string LeftorAgo = "";
if (strDays[0] == '-')
{
LeftorAgo = "ago";
}
else
{
LeftorAgo = "left";
}
this.Dispatcher.Invoke(() =>
{
ShowDate.Text = $"{strDays.TrimStart('-')}\n days {LeftorAgo}";
ShowSubject.Text = Subject;
});
System.Threading.Thread.Sleep(5000);
}
休眠在UI(主)线程上将导致UI冻结。 WPF需要处理事件,而其他则不能使UI响应。频繁调用System.Windows.Forms.Application.DoEvents()
将使UI线程有时间完成其工作。
从UI线程调用Dispatcher.Invoke()
并不是很有意义,因为您告诉它在UI线程上运行代码。
如果将完成的工作放在一个任务或其他线程上,则可以使用Dispatcher.BeginInvoke
将要异步显示的新数据传递回UI线程,而不会阻塞任务。