3

在调用 QueueUserWorkItem() 时,我的分析器中出现间歇性峰值。我每秒排队大约 20 个工作。就复杂性而言,每项工作大致相同。95% 的作业在调用 QueueUserWorkItem 时花费的时间不到 0.01 毫秒。但是每隔几秒钟,似乎是随机的,一项工作需要 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() 中仍然存在问题
4

1 回答 1

1

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

于 2013-08-21T18:31:56.973 回答