【发布时间】:2010-09-15 13:57:26
【问题描述】:
我在一个线程中有一些代码。该代码的主要功能是调用其他方法,这些方法将内容写入 SQL 数据库,如下所示:
private void doWriteToDb()
{
while (true)
{
try
{
if (q.Count == 0) qFlag.WaitOne();
PFDbItem dbItem = null;
lock (qLock)
{
dbItem = q.Dequeue();
}
if (dbItem != null)
{
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
//write it off
PFResult result = dbItem.Result;
double frequency = dbItem.Frequency;
int i = dbItem.InChannel;
int j = dbItem.OutChannel;
long detail, param, reading, res;
detail = PFCoreMethods.AddNewTestDetail(DbTables, _dicTestHeaders[result.Name.ToString().ToLower()]);
param = PFCoreMethods.AddNewTestParameter(DbTables, detail, "Frequency");
PFCoreMethods.AddNewTestParameterValue(DbTables, param, frequency.ToString());
param = PFCoreMethods.AddNewTestParameter(DbTables, detail, "In channel");
PFCoreMethods.AddNewTestParameterValue(DbTables, param, i.ToString());
param = PFCoreMethods.AddNewTestParameter(DbTables, detail, "Out channel");
PFCoreMethods.AddNewTestParameterValue(DbTables, param, j.ToString());
param = PFCoreMethods.AddNewTestParameter(DbTables, detail, "Spec");
PFCoreMethods.AddNewTestParameterValue(DbTables, param, result.Spec);
dbItem.Dispose();
dqcnt++;
sw.Stop();
}
}
catch (Exception ex)
{
}
}
}
AddNewTestParameter 方法使用具有 SQL 代码的第 3 方类。目前我无法访问它的内部。
DbTables 是一个集合对象,其属性是由 3rd 方程序创建的表对象。程序只使用一个 DbTable 对象。
问题是随着时间的推移(几个小时),AddNewTestParameter 方法调用的时间越来越长,从大约 10 毫秒到大约 1 秒。
q 是一个队列,其中的对象包含写入数据库所需的信息。这些项目由主线程添加到此队列中。线程只是将它们取出、写入并处理掉它们。 q.Count 不超过 1,尽管随着数据库写入速度变慢,q.Count 会上升,因为出队无法赶上。在最坏的情况下,q.Count 超过 30,000。我总共向数据库写入了超过 150,000 个条目。
在 SQL 端,我在服务器上运行了一些跟踪,跟踪显示内部 SQL 始终需要大约 10 毫秒,即使在 C# 代码本身需要 1 秒的时间。
所以,目前,我有两个怀疑:
我的代码是问题所在。该线程是低优先级的,也许这可能会影响性能。另外,观察内存使用 20 分钟后,我看到它以大约 100K/min 的速度上升,CPU 使用率似乎恒定在 %2-5 左右。如何确定内存泄漏发生在哪里?我可以将其定位到代码的特定部分吗?
第 3 方代码是问题所在。我怎么能证明这一点?有哪些方法可以观察和确认问题出在 3rd 方代码?
【问题讨论】:
标签: c# performance memory