在调用 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() 中仍然存在问题