我在窗口服务中托管了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 描述:标识安全上下文。
答案 0 :(得分:0)
我有类似的问题。所有这些令牌都在GC中的终结队列中,准备好在终结线程开始时完成。但是因为我们的服务入口点被标记为[STAThread],所以终止线程从未开始。当我们将属性更改为MTAThread时,GC成功回收了这些令牌软件。你我的点有同样的问题但是你可以通过将GC.WaitForPendingFinalizers()放在代码的末尾来检查终结线程是否开始。