Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Mono C时QueueUserWorkItem()性能问题#_C#_Multithreading_Mono_Threadpool_Queueuserworkitem - Fatal编程技术网

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

C# 使用Mono C时QueueUserWorkItem()性能问题#,c#,multithreading,mono,threadpool,queueuserworkitem,C#,Multithreading,Mono,Threadpool,Queueuserworkitem,在调用QueueUserWorkItem()时,我的探查器中会出现间歇性峰值。我每秒大约排20个工作。就复杂性而言,每项工作大致相同。95%的作业在调用QueueUserWorkItem时花费的时间少于0.01毫秒。但每隔几秒钟,似乎是随机的,一个作业将需要20-60毫秒 我正在尝试建立一个平滑的模拟,而只是将我的后台任务排队,这会导致我的帧速率出现严重问题 这不是作业实际完成所需的时间,而是简单地将作业排队所花费的时间。我认为这几乎不需要任何时间,所以这是非常令人沮丧的 foreach ( J

在调用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
我尝试过的事情:

  • 每秒排队更少的作业只会相应地减少挂接,但它仍然挂接
  • 对job.queued变量的所有访问设置锁(obj)
  • 使用SmartThreadPool而不是defaultThreadPool。问题仍然存在 在STP的QueueWorkItem()中持续存在

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

您是否能够在Windows上运行它,以查看这是否是mono问题?在我看来,您可能会不时在任务队列中遇到争用。当您尝试添加任务时,队列可能被试图从队列中获取工作的线程锁定。进一步深入研究,我认为这是线程之间争用的问题。探查器显示在QueueWorkItem的Monitor.Exit()内花费的时间。但我该如何防止这种情况?当然,队列周围的锁不应该持续60毫秒!Henk-我正在Windows版本的Mono 2.6上运行它。我不能交换Mono,因为它是一个更大的框架(Unity Engine)的一部分。大概再过一年左右吧。我找不到此标志的任何引用。你能告诉我它的功能吗?如果我能够启用它,我会期望什么?谢谢