C# ThreadPool 应用程序性能随时间下降

标签 c# multithreading performance threadpool

我有一个类,比如“MyComputation”,它在一个长构造函数中进行大量计算。单独执行时通常需要大约 20 毫秒才能运行(没有磁盘 i/o 或网络操作)。此类的 100 个左右的实例由父类创建,例如“ComputeParent”,父类将它们作为工作项在 ThreadPool 中排队:

ThreadPool.QueueUserWorkItem(myComputationCall, my_computation_data);

“myComputationCall”看起来像这样:

    public static void myComputationCall(Object my_computation_data)
    {
        try
        {
            MyDataObject data = (MyDataObject)my_computation_data;

            var computation_run = new MyComputation(data.parameter1, data.parameter2);

            data.result = computation_run.result;
        }
        finally
        {
            if (Interlocked.Decrement(ref num_work_items_remaining) == 0)
                done_event.Set();
        }
    }

done_event 是一个静态的 ManualResetEvent:

    private static ManualResetEvent done_event;

    ...

    done_event = new ManualResetEvent(false);

我针对各种输入参数运行 ComputeParent 大约 500 次左右。所以我有很多嵌套类。问题在于执行 ComputeParent 所需的时间逐渐增加。运行每个特定 ComputeParent 所需的时间之间会有一定的差异,但时间量会稳步增加(从几何角度来看,每次连续迭代所需的时间会更长)。

尽管该程序的内存消耗相当高(~300MB),但它并没有随着时间的推移而明显增加。运行在8个逻辑核心的电脑上,处理器的使用似乎很突发。我不确定还有什么可能与该问题相关。

我宁愿不必通过批处理文件运行 ComputeParent,尽管完成后问题似乎不会出现。

最佳答案

如果 ThreadPool 中的可用线程数变为 0,并且您继续添加新的工作项,那么新添加的工作项将“等待”。这意味着您的 ComputeParent 将等待它的“myComputationCall”实例。启动越来越多的 ComputeParent 将导致它们的平均执行时间增加。

关于C# ThreadPool 应用程序性能随时间下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10523278/

相关文章:

c# - 消费者运行时应用程序崩溃并退出调试器 & rabbit mq 服务重启

python - 如何加速 numpy 代码

wpf - DrawingVisual vs Canvas.OnRender 对许多不断变化的形状的性能

c# - 如何使用 OpenXml 在具有多项选择下拉列表的 excel 文件中创建单元格?

c# - IXmlSerializable 和继承

c# - 如何在C#/.NET2.0中实现等待一段时间的windows服务循环

持续集成中的 Java 分析

c# - 即使进程正在运行,Process.HasExited 也会返回 true?

c++ - 当应用程序在没有适当的 wait() 调用的情况下关闭时 QThread 会发生什么?

c# - 使用 Invoke 方法从外部线程关闭窗体