gpt4 book ai didi

wpf - WPF应用程序出现问题,GUI响应缓慢

转载 作者:行者123 更新时间:2023-12-02 04:10:41 24 4
gpt4 key购买 nike

我一直在分析WPF应用程序,该应用程序基本上是从服务器获取数据并在GUI中显示数据。
此代码不是我的代码,并且该应用程序存在与GUI响应缓慢有关的问题,我正在尝试查找导致该问题的原因。
我想与您分享我可能会出现问题的想法,并且我想听听您对此有何看法,无论它是否有意义。
为了从服务器获取数据,应用程序使用了7个线程(之所以如此,主要是因为应用程序逻辑,因此不必过多地关注7个线程,而不仅仅是一个...),每个线程都是通过调用一个称为CreateThreadForTask()的方法来创建的

public void StartAllThreads()
{
this.CreateThreadForTask(Tasks.Task1);
this.CreateThreadForTask(Tasks.Task2);
this.CreateThreadForTask(Tasks.Task3);
this.CreateThreadForTask(Tasks.Task4);
this.CreateThreadForTask(Tasks.Task5);
this.CreateThreadForTask(Tasks.Task6);
this.CreateThreadForTask(Tasks.Task7);
}

public void CreateThreadForTask(Tasks task)
{
... // this part of the code is not important

//! Initialize and start timer
timer = null;
timer = new DispatcherTimer();
timer.Tick += new EventHandler(RunMainSyncForTask);
timer.Start();
}

public void RunMainSyncForTask(object s, EventArgs e)
{
int sec = int.Parse(AppSettings.GetSetting("syncInterval"));
timer.Interval = new TimeSpan(0, 0, sec);

//threadCaller is a background worker
threadCaller = InitializeThread();
threadCaller.DoWork += DoWorkEventHandler(StartSync);
threadCaller.RunWorkerAsync();
}
当我调试代码时,我注意到所有线程都是使用DispatcherTimer创建的。我认为该应用程序正在创建7个DispatcherTimer,并将计时器的Tick事件与RunMainSyncForTask()方法链接,该方法在内部创建了一个后台工作程序,该后台工作程序从服务器获取数据并将该数据保存到本地数据库。
现在,这取自MSDN

The DispatcherTimer is reevaluated at the top of every Dispatcher loop.

Timers are not guaranteed to execute exactly when the time interval occurs, but they are guaranteed to not execute before the time interval occurs. This is because DispatcherTimer operations are placed on the Dispatcher queue like other operations. When the DispatcherTimer operation executes is dependent on the other jobs in the queue and their priorities.


因此,基于此,我相信每次计时器执行滴答事件时,应用程序都会向线程发送垃圾邮件,并且此操作同时进行7次。由于DispatcherTimer的性质,所有这些操作都被添加到Dispatcher队列中,由于Dispatcher繁忙,这使得GUI响应速度变慢。
另外,该应用程序的另一个问题是,在运行该应用程序时,它将占用大约90-95%的CPU,我认为,如果我的假设正确,这也可能是导致此问题的原因。
因此,如果您可以分享一些内幕,我将不胜感激。
谢谢。

最佳答案

您获得了90-95%的CPU,因为您通过疯狂的线程调用网络建立了一种繁忙的等待方式。

如果您使用这种StartSync逻辑发布状态通知或将数据返回到GUI,那么您会遇到很多麻烦。如果您使用的是.Net 4.0,则应切换到Task Parallel Library并让框架为您处理所有这些操作。它还支持优美的取消等。

如果您不想使用TPL,我建议改为将WindowDispatcher(使用常见的嫌疑人:Invoke或BeginInvoke)或SynchronizationContext(与Post异步,与Send同步)传递给各个任务,以用于这些任务必须在GUI中完成。

关于wpf - WPF应用程序出现问题,GUI响应缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5346034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com