WPF UI在while循环期间保持冻结

问题描述 投票:0回答:1

在这段代码中,我的用户界面死机了,并且没有更新,尽管控制台写线工作得很好,所以我确定它正在按照我的意愿通过循环

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);

            }
c# wpf while-loop textblock
1个回答
0
投票

休眠在UI(主)线程上将导致UI冻结。 WPF需要处理事件,而其他则不能使UI响应。频繁调用System.Windows.Forms.Application.DoEvents()将使UI线程有时间完成其工作。

从UI线程调用Dispatcher.Invoke()并不是很有意义,因为您告诉它在UI线程上运行代码。

如果将完成的工作放在一个任务或其他线程上,则可以使用Dispatcher.BeginInvoke将要异步显示的新数据传递回UI线程,而不会阻塞任务。

© www.soinside.com 2019 - 2024. All rights reserved.