2013-08-21 28 views
3

我在Profiler周圍調用QueueUserWorkItem()時出現間歇性尖峯。我每秒排隊20個職位。就複雜性而言,每項工作大致相同。在調用QueueUserWorkItem時,95%的作業花費少於0.01ms。但每隔幾秒鐘,看似隨意,一份工作將花費20-60毫秒!QueueUserWorkItem()使用單聲道C#的性能問題#

我試圖建立一個平滑的模擬,只是排隊我的後臺任務是導致嚴重的結果在我的幀率。

這不是工作實際完成所需的時間,這是花在簡單排隊工作上的時間。我期望的應該幾乎沒有時間,所以這是非常令人沮喪的。

foreach (Job j in jobs_to_process) 
{ 
    Job current_job = j; 
    if (!current_job.queued) 
    { 
     current_job.queued = true; 

     Profiler.BeginSample("QueueWorkItem"); 
     ThreadPool.UnsafeQueueUserWorkItem(current_job.DoCalculation, null); 
     Profiler.EndSample(); 
    } 
} 

//now I remove queued items from jobs_to_process, move them to jobs_in_progress list 

事情我已經嘗試:

  • 排隊每秒,就業機會減少不僅會導致更少的比例掛鉤,但它仍然扯起。
  • 將鎖(obj)放在所有對job.queued變量的訪問中
  • 使用SmartThreadPool而不是defaultThreadPool。問題仍然 持續STP的QueueWorkItem()內
+1

你能在Windows上運行它,看看這是否是單聲道問題? –

+1

對我來說就像你可能不時爭奪任務隊列。當您嘗試添加任務時,可能是隊列被嘗試從隊列中取出工作的線程鎖定。 – Tudor

+0

進一步鑽取,我認爲這是線程間爭用的問題。分析器顯示時間在QueueWorkItem的Monitor.Exit()中使用。 但是,我會如何防止這種情況?當然,隊列中的鎖定不應該持續60毫秒! –

回答

1

運行時,單聲道(僅適用於單主兼容,因爲它是最近承諾)與--server標誌嘗試。

+0

我卡在單聲道2.6。可能會再過一年左右。我無法找到這個標誌的任何參考。你能告訴我它的功能和我可能期望的功能嗎?謝謝。 –

+0

從主設備安裝mono並檢查'man mono' – knocte