pus*_*kin 5 .net c# gdi resource-leak .net-6.0
我有一个 .NET Framework 控制台应用程序(4.6.2 和 4.7.2 出现此问题)。SaveFileDialog
它连续打开5 次,每次都等待上一个对话框关闭。
查看 TaskManager 中的 GDI 列,我看到 GDI 对象计数从 79 开始,然后达到 83,然后是 87,等等。每次都会泄漏 4 个对象。OpenFileDialog
我测试过的一个或其他 CommonDialogs 不会发生这种情况。
我正在处理该对象,并且在 .NET Core 3.1 中没有看到此问题(我在 .NET Core 3.1 应用程序中没有看到此问题,但在下面的最小示例中,我确实在 .NET Core 3.1 和 .NET 6)。
GDIView 工具显示了这一点:
处理 | 对象类型 | 内核地址 | 检测计数器 |
---|---|---|---|
0xbc041a92 | 地区 | 0xffffffffffbc1a92 | 1 |
0x8410215d | 刷子 | 0xffffffffff84215d | 1 |
0x811024af | 刷子 | 0xffffffffff8124af | 1 |
0x620433b1 | 地区 | 0xffffffffff6233b1 | 1 |
0x4a103550 | 刷子 | 0xffffffffff4a3550 | 1 |
0x8e043569 | 地区 | 0xffffffffff8e3569 | 1 |
0x35103a54 | 刷子 | 0xffffffffff353a54 | 1 |
0xda013d30 | 直流 | 0xffffffffffda3d30 | 1 |
0xdc043fc6 | 地区 | 0xffffffffffdc3fc6 | 1 |
C#代码:
using System;
using System.Threading;
using System.Windows.Forms;
namespace GDILeakTest
{
internal class Program
{
[STAThread]
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
using (var dialog = new SaveFileDialog())
{
dialog.ShowDialog();
}
Thread.Sleep(5000);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是 .NET 中的已知错误吗?
更新:有两件事似乎可以解决泄漏问题(尽管有趣的是,这些对我的实际应用程序没有帮助)。
Application.Run()
末尾添加Main
[STAThread]
并显示 STA 线程内的对话框:Thread t = new Thread(() =>
{
dialog.ShowDialog();
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
199 次 |
最近记录: |