我有一個程序有時運行速度非常慢。TryTake阻止收集性能
我試圖Teleriks Justtrace找出,什麼可能會導致應用程序的掛起。
非UI線程(因此我相信這不是真正的掛起的原因)assync。獲取對象(Enqueue workitems)並將其引入一些工作。
排隊:
public void EnqueueObject(WorkUnit workunit)
{
try
{
workUnits.Add(workunit);
}
catch (Exception ex)
{
/handle exception
}
}
出列:
public WorkUnit Dequeue()
{
try
{
WorkUnit aWorkUnit = null;
workUnits.TryTake(out aWorkUnit, 1000);
return aWorkUnit ;
}
catch (InvalidOperationException ex)
{
//
}
return null;
}
TryTake被用來檢查當前工作(而不是調用時剛剛拋出一些錯誤BlockingCollection Complete方法的中止 - 這不是我不希望使用錯誤進行編程流程)
致電請求退出:
while(!isStopped)
{
ProcessWorkItem(Dequeue());
}
到這裏看起來很簡單。
問題是,Teleriks JustTrace顯示,行「workUnits.TryTake(out aWorkUnit,1000);」佔該程序總執行時間的30%。
這怎麼可能?
有了更多的細節,它顯示了TryTake System.Threading.Monitor.Wait內部一直佔用 - 我認爲Wait會發送一個線程進入睡眠狀態,所以它在等待期間不消耗任何東西。思想中的錯誤在哪裏?
應該沒問題。但是你是否將大量項目添加到隊列中?還是每次都真的等待一秒?順便說一下,如果您使用BlockingCollection.CompleteAdding()會導致錯誤,那麼您一定是做錯了! – 2013-02-27 11:06:17
你有沒有試過讓'TryTake'等待一個元素的使用?代碼:'workUnits.TryTake(out aWorkUnit,-1);'。 – Dzienny 2013-02-27 11:25:11
@MatthewWatson如果你在一個循環中有一個Take(),然後使用CompleteAdding(),Take()將會拋出一個InvalidOperationException異常。 (請參閱http://msdn.microsoft.com/en-us/library/dd997371.aspx)。這裏不需要例外。金額取決於。我試圖添加3000個項目到隊列中。 – Offler 2013-02-27 12:19:52