托管 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() 放在你的代码末尾来检查完成线程是否开始。
我在 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() 放在你的代码末尾来检查完成线程是否开始。