我在一個線程中有一些代碼。該代碼的主要功能是調用其他方法,它寫的東西到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代碼的第三方類。目前我無法訪問其內部。
DbTables是一個集合對象,其屬性是由第三方程序創建的表對象。程序使用的只有一個DbTable對象。
問題是,隨着時間的推移(幾個小時),AddNewTestParameter方法調用花費的時間越來越長,從大約10ms開始到大約1sec。
q是包含寫入數據庫所需信息的對象的隊列。這些項目由主線程添加到此隊列中。線程只是把它們拿出來寫出來,然後把它們處理掉。 q.Count不超過1,儘管隨着數據庫寫入速度變慢,q.Count上升,因爲出隊無法趕上。最糟糕的是,q.Count超過了3萬。我總共向數據庫寫入了超過150,000個條目。
在SQL端,我在服務器上運行了一些跟蹤,並且跟蹤顯示內部SQL總是需要大約10ms,即使在C#代碼本身需要1秒的時間內。
所以,目前,我有2個疑慮:
我的代碼的問題。該線程是低優先級的,也許這可能會影響性能。另外,在觀看20分鐘的內存使用情況後,我看到它以約100K/min的速度上升,CPU利用率在%2-5左右似乎保持不變。我怎樣才能找出內存泄漏發生的地方?我可以將它指向代碼的特定部分嗎?
第三方代碼是問題。我怎麼能證明這一點?有什麼方法可以觀察並確認問題在於第三方代碼?
使用內存分析器。 – 2010-09-15 15:18:12