C# 使用Mono C时QueueUserWorkItem()性能问题#
在调用QueueUserWorkItem()时,我的探查器中会出现间歇性峰值。我每秒大约排20个工作。就复杂性而言,每项工作大致相同。95%的作业在调用QueueUserWorkItem时花费的时间少于0.01毫秒。但每隔几秒钟,似乎是随机的,一个作业将需要20-60毫秒 我正在尝试建立一个平滑的模拟,而只是将我的后台任务排队,这会导致我的帧速率出现严重问题 这不是作业实际完成所需的时间,而是简单地将作业排队所花费的时间。我认为这几乎不需要任何时间,所以这是非常令人沮丧的C# 使用Mono C时QueueUserWorkItem()性能问题#,c#,multithreading,mono,threadpool,queueuserworkitem,C#,Multithreading,Mono,Threadpool,Queueuserworkitem,在调用QueueUserWorkItem()时,我的探查器中会出现间歇性峰值。我每秒大约排20个工作。就复杂性而言,每项工作大致相同。95%的作业在调用QueueUserWorkItem时花费的时间少于0.01毫秒。但每隔几秒钟,似乎是随机的,一个作业将需要20-60毫秒 我正在尝试建立一个平滑的模拟,而只是将我的后台任务排队,这会导致我的帧速率出现严重问题 这不是作业实际完成所需的时间,而是简单地将作业排队所花费的时间。我认为这几乎不需要任何时间,所以这是非常令人沮丧的 foreach ( J
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()中持续存在
--server
标志(仅与mono master兼容,因为它最近已提交)。您是否能够在Windows上运行它,以查看这是否是mono问题?在我看来,您可能会不时在任务队列中遇到争用。当您尝试添加任务时,队列可能被试图从队列中获取工作的线程锁定。进一步深入研究,我认为这是线程之间争用的问题。探查器显示在QueueWorkItem的Monitor.Exit()内花费的时间。但我该如何防止这种情况?当然,队列周围的锁不应该持续60毫秒!Henk-我正在Windows版本的Mono 2.6上运行它。我不能交换Mono,因为它是一个更大的框架(Unity Engine)的一部分。大概再过一年左右吧。我找不到此标志的任何引用。你能告诉我它的功能吗?如果我能够启用它,我会期望什么?谢谢