gpt4 book ai didi

multithreading - 调用逐渐变慢

转载 作者:行者123 更新时间:2023-12-03 13:03:11 24 4
gpt4 key购买 nike

我一直在研究应用程序中的性能问题,归结为调用Invoke所花费的时间越来越长。我正在使用System.Diagnostics.Stopwatch来对Invoke调用本身进行计时,虽然它在20毫秒开始启动,但几百次调用后大约在4000毫秒左右。记录显示时间稳定增加(每个调用最初增加〜2ms,然后增加〜100ms甚至更多)。我有三个调用,它们都表现出相同的行为。

我正在加载医学图像,并且在执行此操作时需要保持UI响应,因此使用后台工作程序,我可以在其中加载和处理图像,但是一旦加载,则需要将其添加到man UI中,以便用户进行操作看。

直到我尝试进行800多幅图像的研究后,问题才出现。以前,我的测试集大约有100张图像,总大小从400MB到16GB不等。问题集只有2GB,需要近10分钟的时间才能接近50%,而16GB集的总加载时间约为30秒,因此排除了总图像大小是问题。供引用,我的开发机器具有32GB RAM。我通过注释掉整个内容来确保它不是所调用方法的内容。

我想了解的是,调用所花费的时间怎么可能逐渐增加?这是真的吗?我的调用堆栈没有变得更深,线程数是一致的,正在消耗什么资源来导致此问题?我想念什么!?

public void UpdateThumbnailInfo(Thumbnail thumb, ThumbnailInfo info)
{
if (InvokeRequired)
{
var sw = new Stopwatch();
sw.Start();
Invoke((Action<Thumbnail, ThumbnailInfo>) UpdateThumbnailInfo, thumb, info);
Log.Debug("Update Thumbnail Info Timer: {Time} ms - {File}", (int) sw.ElapsedMilliseconds, info.Filename);
}
else
{
// Do stuff here
}
}

最佳答案

看起来您正在从其他线程调用UpdateThumbnailInfo。如果是这样,则这是预期的行为。发生的事情是您正在UI线程上排队数百个任务。对于每个加载的图像,UI都需要做很多事情,因此,随着图像数量的增加,整体操作会变慢。

您可以做的几件事:
*使用BeginInvoke代替Invoke。由于您的函数是void类型,因此不需要EndInvoke*使用SuspendLayoutResumeLayout可以防止UI进行增量更新,而是在加载所有图像时对所有内容进行一次更新。

关于multithreading - 调用逐渐变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50828762/

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