未等待的任务导致异常的内存泄漏?

时间:2019-01-21 23:02:02

标签: c# .net task-parallel-library clr

下面是一个简单的控制台应用程序代码,该代码反复触发异步调用,但不等待。被调用的函数将引发异常。 运行此控制台应用程序会产生以下结果:

  • 在VS下的调试器中-内存使用量是固定的。没有泄漏。
  • 直接运行exe(在vs之外,而不是在调试器之外)-内存一直增长到gb,最终OOM约为4gb。

我不确定如何解释这些结果。任何帮助将不胜感激。

    static void Main(string[] args)
    {
        while (true)
        {
            Task.Run(() => RunMain());
        }
        Console.ReadLine();
    }
    static Exception ex = new Exception();
    private static void RunMain()
    {
        throw ex;
    }

编辑: 我主要感兴趣的是为什么连续抛出未观察到的异常时内存泄漏。

1 个答案:

答案 0 :(得分:3)

使用该Task.Run()不断创建新任务时,您正在创建占用更多内存的新对象。我相信您忽略的是任务本身就是一个对象。

当调用Task.Run()时,您将Task添加到线程池的队列中。我敢打赌,内存泄漏是由于新任务不断被添加到线程池的队列中,而线程池无法跟上它。