这是 .NET Framework/.NET Core/.NET 6 中已知的 GDI 泄漏错误吗?

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 中的已知错误吗?

更新:有两件事似乎可以解决泄漏问题(尽管有趣的是,这些对我的实际应用程序没有帮助)。

  1. 在方法Application.Run()末尾添加Main
  2. 删除[STAThread]并显示 STA 线程内的对话框:
Thread t = new Thread(() =>
{
    dialog.ShowDialog();
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
Run Code Online (Sandbox Code Playgroud)