托管 Window 服务中的令牌泄漏

Token leak in managed Window service

我在 window 中托管了 WCF 服务 service.I 通过这个 service.On 观察到一些句柄泄漏 我发现泄漏的原因是数据库操作在 *.accdb(MS acsess) file.To 上执行排除了其他可能性(使用 WCF 等)我在数据库上调用打开和关闭,但我仍然看到令牌泄漏。该服务 运行ing 是本地系统帐户,本地 computer.The 中存在数据库字段,打开和关闭都成功。每次我在数据库上调用 Open 时都会生成三个或四个给定类型的令牌,并且计数不会减少 close.So 他们继续 increasing.When i 运行 作为登录用户 i 的服务没有看到内存泄漏

protected override void OnStart(string[] args)
                {
                    ThreadStart t = new ThreadStart(DBConenctionThread);
                    Thread t2 = new Thread(t);
                    t2.Start();
                }

void DBConenctionThread()
        {
            bool b = true;
            String s = @"Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=D:\testdatabase\tempelate2.accdb;Uid=;Pwd=;";
            while (b)
            {
                try
                {
                    using (OdbcConnection dbConnection = new OdbcConnection(s))
                    {

                        dbConnection.Open();
                        dbConnection.Close();

                    }
                }
                catch (NotSupportedException ex)
                {

                }
                catch (Exception ex)
                {
                }
            }
        }

这些是从进程浏览器中泄露的令牌的详细信息

姓名:新台币AUTHORITY\SYSTEM:3e7 类型:代币 说明:标识安全上下文。

我有非常相似的问题。所有这些令牌都在 GC 的终结器队列中,准备在终结线程启动时被终结。但是因为我们的服务入口点被标记为 [STAThread],终结线程从未启动过。当我们将属性更改为 MTAThread 时,GC 成功回收了这些令牌。你我有同样的问题,但你可以通过将 GC.WaitForPendingFinalizers() 放在你的代码末尾来检查完成线程是否开始。