如何解决UI线程上的内存分配问题,这不是命令行上的问题
本文关键字:问题 内存 分配 命令行 这不是 线程 何解决 解决 UI | 更新日期: 2023-09-27 18:33:54
我编写了一个算法(函数(来从列表中读取多个文件,操作和聚合这些文件,然后存储为单个文件。这工作正常,并在不到一秒半的时间内处理每个文件。
为了改善用户体验,我创建了一个简单的GUI来准备算法(输入文件列表,输出文件位置和处理选项等(。这工作正常。
但是,该算法在 UI 线程(Windows 窗体应用程序(上通过命令行线程(控制台应用程序(执行所需的时间要长得多。我找不到任何解释为什么。命令行执行时间与文件数接近线性。但是,UI 线程或 BackgroundWorker 线程执行是非常非线性的,并且很快就会变得太慢而无法使用。见下表。(我在 100 小时后杀死了 2 个文件运行(。
文件数量 1, 3, 5, 13, 20
命令行执行时间 1 秒、4 秒、7 秒、19 秒、29 秒
UI 后台工作线程执行时间 1 秒、7 秒、22 秒、309 秒、441 秒
我认为这与我用来执行处理的 BackgroundWorker 类有关,但是在删除 backgroundWorker 并直接从按钮按下调用函数时,导致它更慢(82 个文件需要 5 秒(并导致 UI 锁定((。
我现在创建了一个独立的静态测试函数,分散在秒表上,以测试性能并发现问题。
有一件事被突出显示为每增加一个文件变得越来越慢。
stopwatches[21].Start();
byte[] canData = reader.ReadBytes(8);
stopwatches[21].Stop();
"reader"是BinaryReader。这被用作简单文件,并且正在处理ZipArchiveEntry文件。
突出显示为速度变慢的其他代码行始终是内存分配,要么是"new"语句,要么是 List<>。添加函数。
我对BinaryReader的理解涉及它们缓冲传入的信息,从而分配内存。因此,我认为这是一个内存问题。为了支持这一点,监视任务管理器的 UI 线程/后台工作线程使用比命令行版本多得多的内存。我怀疑性能以非线性方式下降,因为我的机器开始交换。
UI (Windows 窗体应用程序( 线程上的内存分配有何不同?我应该如何调整我的代码以在从命令行(控制台应用程序(运行时以相同的方式执行?
故障查找
在创建了一个与命令行一样快的工作 UI(新的琐碎 UI(之后,我开始寻找我的应用程序性能不佳的原因,我系统地删除了代码、回调、方法、数据,最终删除了所有组件,没有任何帮助。我现在有两段相同的代码,一段运行良好,一段无法正常工作......所以我系统地对每个项目文件夹中的文件进行了比较,试图了解重要的差异(忽略名称更改等(,所以我找到了我认为可能是问题的地方。然后我在Visual Studio之外更改了文件,重建并运行...而且性能很好。成功,发现故障。
答案
错误出在 csproj 文件中。
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
我修改为以下内容
<Reference Include="System.Core" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
注意两者都有
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
另外:我仍然找不到在Visual Studio中设置此选项的位置,在查找要检查的文件之前,我确实浏览了两组属性,但是即使在找到问题之后,它仍然在Visual Studio中隐藏
。我相信这是因为我从从 Visual Studio 2008 升级的表单中复制了表单,并且升级过程一定未正确完成。使用 Visual Studio 2015 升级。
一个值得关注的...快速的最后一个问题。我现在应该更新标题(主要问题(以更好地阐明实际问题吗?