托管窗口服务中的令牌泄漏

时间:2015-03-18 06:31:03

标签: .net database service memory-leaks impersonation

我在窗口服务中托管了WCF服务。我正在观察这个服务的一些句柄泄漏。在调查我能够发现泄漏的原因是在* .accdb(MS acsess)文件上执行的DB操作为了排除其他可能性(使用WCF等),我已经在c#中创建了一个测试窗口服务,并且在我的Onstart方法中,我已经启动了一个线程,我在其中调用Open并关闭数据库,我仍然看到令牌泄漏。运行的服务是Local System帐户,db fiel存在于本地计算机中。打开和关闭都是成功的。每次我在数据库上调用Open时生成给定类型的三个或四个令牌,并且在关闭时计数不会减少。因此,他们继续增加。当我以登录用户身份运行服务时,我没有看到计量泄漏

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)
                {
                }
            }
        }

这些是从流程资源管理器泄露的令牌的详细信息

名称:NT AUTHORITY \ SYSTEM:3e7 输入:token 描述:标识安全上下文。

1 个答案:

答案 0 :(得分:0)

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