在这里,我使用 Microsoft 性能监视器来检查 c# 应用程序的凭据句柄。我发现凭据句柄不断增长。可以打开性能监视器,并在"每个进程的安全性统计信息"下添加"凭据句柄"计数器。会导致手柄泄漏吗?GC 会收集句柄吗?如何使用 windbg 或其他工具来分析此问题?
这是我的示例程序:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DBTest
{
class DBTest2
{
class Program
{
[SuppressMessage("ReSharper", "InconsistentlySynchronizedField")]
static void Work(object data)
{
var dbConn = new SqlConnection("*********");
SqlConnection.ClearPool(dbConn);
dbConn.Open();
string sqlQuery = "SELECT DBName = name FROM master..sysdatabases WHERE name = @DBName";
using (var command = new SqlCommand(sqlQuery, dbConn) { CommandTimeout = 300 })
{
command.Parameters.Add(new SqlParameter("@DBName", SqlDbType.NVarChar) { Direction = ParameterDirection.Input, Value = "***" });
command.ExecuteScalar();
}
dbConn.Close();
}
static void Main(string[] args)
{
Timer tmr = new Timer(Work, "tick...", 1000 * 60 * 1, 30 * 1000);
Console.ReadLine();
tmr.Dispose();
return;
}
}
}
}
把你的 SqlConnection 也放在一个 using 块中:
using (var dbConn = new SqlConnection("*********"))
{
}