我在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()內
你能在Windows上運行它,看看這是否是單聲道問題? –
對我來說就像你可能不時爭奪任務隊列。當您嘗試添加任務時,可能是隊列被嘗試從隊列中取出工作的線程鎖定。 – Tudor
進一步鑽取,我認爲這是線程間爭用的問題。分析器顯示時間在QueueWorkItem的Monitor.Exit()中使用。 但是,我會如何防止這種情況?當然,隊列中的鎖定不應該持續60毫秒! –