c# - 抛出异常的未等待任务的内存泄漏?

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

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

  • 在调试器下的 VS 中 - 内存使用率是平稳的。没有泄漏。
  • 直接运行 exe(在 vs 之外,而不是在调试器下)——内存不断增长到 gbs,最终 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;
    }

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

最佳答案

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

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

关于c# - 抛出异常的未等待任务的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54298944/

相关文章:

c# - 让1个线程同时执行多个方法

c# - TaskContinuationOptions.OnlyOnFaulted 与 try catch

c# - 使用 int 和 String 的 LINQ to SQL C# 函数

c# - 我的数据库系统找不到 asp.net 中指定的文件

c# - 如何制作伦敦地铁的加权图

.net - Reload() 不更新 EF 实体

C# winforms 绘制到位图无效参数

c# - 在 C# 中运行 javascript

.net - C# 中的 Java RuntimeException 等价物?

c# - Parallel.ForEach - 它在单核机器上运行在哪里?