使用Mono C#的QueueUserWorkItem()性能问题

时间:2013-08-21 15:17:51

标签: c# multithreading mono threadpool queueuserworkitem

对于QueueUserWorkItem()的调用,我的探查器中出现间歇性尖峰。我每秒排队大约20个工作岗位。每项工作在复杂性方面大致相同。在调用QueueUserWorkItem时,95%的作业花费不到0.01ms。但每隔几秒钟,似乎是随机的,一份工作需要20-60毫秒!

我正在尝试构建一个平滑的模拟,只是排队我的后台任务会导致我的帧速率出现严重问题。

这不是工作实际完成所需的时间,这是花在简单地排除工作上的时间。我所期待的应该几乎没有时间,所以这非常令人沮丧。

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

我尝试过的事情:

  • 每秒排队较少的作业只会导致比例减少,但仍然会出现问题。
  • 将lock(obj)置于对job.queued变量
  • 的所有访问权限周围
  • 使用SmartThreadPool而不是defaultThreadPool。问题还在 持久存在于STP的QueueWorkItem()

1 个答案:

答案 0 :(得分:1)

运行单声道时尝试使用--server标志(仅与单声道主控兼容,因为它最近已提交)。