2013-08-21 29 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