关于QueueUserWorkItem()的调用,我的探查器中出现间歇性尖峰。我每秒大约要排队20个工作。就复杂性而言,每个作业大致相同。 95%的作业在调用QueueUserWorkItem上花费的时间少于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

我尝试过的事情:
  • 每秒减少作业的排队只会成比例地减少故障,但仍会造成故障。
  • 在对job.queued变量
  • 的所有访问中都加锁(obj)
  • 使用SmartThreadPool代替defaultThreadPool。问题仍然存在
    保留在STP的QueueWorkItem()里面
  • 最佳答案

    在运行mono时尝试使用--server标志(仅与mono master兼容,因为它是最近提交的)。

    10-06 02:16