CancellationToken 泄漏内存

2024-01-03

我有一个计时器,每 2 秒启动 2 个任务...我在一个简单的列表中跟踪这些任务(这样我可以在停止应用程序时等待它们完成)。

这些任务有效地进入数据库,运行几次更新并完成。
任务本身的运行时间不会超过一秒

...
// global variables to keep track of the running tasks.
List<Task> _tasks = new List<Task>();
CancellationTokenSource _cts = new CancellationTokenSource();

// in the timer function
private void Timer(object sender, ElapsedEventArgs e)
{
  _tasks.Add( Foo1Async(_cts.Token) );
  _tasks.Add( Foo2Async(_cts.Token) );
  // remove the completed ones
  _tasks.RemoveAll(t => t.IsCompleted);
}
...

几分钟后,内存从 40Mb 增加到 130Mb,(并且还在攀升)...

如果我更换only下面的代码和没有别的

...
  _tasks.Add( Foo1Async( CancellationToken.None)) );
  _tasks.Add( Foo2Async( CancellationToken.None)) );
...

内存保持稳定在 40Mb,永远不会增加。

有几点

  • 我在测试期间不会取消任何任务(它们都会运行完成)。
  • 我在测试期间没有抛出任何异常。
  • 我使用的数据库是Sqlite
  • 在这两个测试中,我做了完全相同的工作,唯一的区别是使用的 CancellationToken。
  • 即使我等待很长时间,记忆似乎也永远不会被释放。
  • 定时器是一个System.Timers.Timer我只有在处理完计时器事件后才重新启动它。
  • 我不使用任何其他代币(或代币来源)
  • 我不注册任何令牌取消。

如果我拍摄内存快照的数量CancellationCallbackInfo似乎是问题所在,但我不知道它们从哪里来以及如何释放它们。

查看.NET源代码,回调用于CancellationTokenSource但我不太确定如何添加更多内容(或如何释放它们)。

关于我使用时可能导致内存泄漏的任何建议_cts.Token与我使用时相比CancellationToken.None


某些 .NET DBCommand 代码存在问题,异步函数会注册取消,但只有在出现异常时才会进行处理。正如您所注意到的,在大多数情况下它只会增加列表。

这个问题曾经被修复过去年在 .NET core v2.x 中 https://github.com/dotnet/corefx/commit/297fcc33db4e65287455f6575684f24975688b53,(不确定它是否会在 .NET 标准中得到修复,我使用的是 4.6.1,但它仍然是一个问题)。

我解决这个问题的一种方法是围绕我需要的异步函数编写自己的包装器。

您还可以调用非异步函数(但您会失去异步函数提供的“取消”功能)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CancellationToken 泄漏内存 的相关文章

随机推荐

  • 对密度曲线下方的区域进行阴影处理,以标记最高密度区间 (HDI)

    我认为这应该很简单 但尽管网上有大量信息 我还是迷失了 我的问题 我有一个数据点向量 我想为其绘制密度曲线 然后为曲线下方的区域着色以表示最高密度区间 HDI 当然 我正在努力实现这一目标ggplot2包 特别是qplot 因为我的数据是向
  • Visual Studio 代码显示错误“找不到名称日期”

    我正在开发一个基本的 Angular 项目Visual Studio代码 版本1 19 2 作为我的 IDE 下面的代码运行良好 但 VSC 似乎对此不满意 当我使用时它显示错误new Date or JSON stringify 但最终结
  • 将结构体数组转换为双精度数组[重复]

    这个问题在这里已经有答案了 我将 7 个患者的数据 每个数据包含 19 个特征 合并到一个结构中 如下所示 数据现在位于具有 19 个字段的 7x1 结构中 我需要做什么才能将结构转换为双精度数组 我需要将其用作 SVM 分类器的输入 或者
  • 我可以在 Eclipse 中从构造函数自动生成字段吗?

    当我在 Eclipse 中编码时 我喜欢尽可能地偷懒 所以我经常输入类似这样的内容 myObject new MyClass myParam1 myParam2 myParam3 即使 MyClass 不存在 它的构造函数也不存在 单击几下
  • Symfony2 - 我应该把用户上传的文件放在哪里? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是 Symfony 的新手 我将用户上传的图像放在下面 web bundles mybundle images 目录 但我觉得这不是一个好的做
  • 如何在 Android 市场上发布应用程序更新?

    我已经在 Android 市场上有一个应用程序 现在我想上传该应用程序的更新 我使用相同的包名称创建了新应用程序 我增加了版本代码和名称 我使用相同的密钥库签名 等等 现在我想知道如何发布更新 我是否将更新作为单独的应用程序上传 或者我还能
  • 如何使用 jQuery 读取 CSS 文件

    好的 我有一个包含 jQuery 的 HTML 页面 我有一个 CSS 文件 里面有很多行 我想阅读all来自外部 CSS 文件的给定元素的样式 而不是内联样式 我有以下代码 看起来应该可以工作 var styleProperties va
  • C:检查命令行参数是否为整数?

    签名isdigit int isdigit int c 签名atoi int atoi const char nptr 我只是想检查传递的命令行参数是否是整数 这是 C 代码 include
  • 获取 Magento 中的当前 URL 并显示一些内容

    我正在尝试获取 Magento 中的当前 URL 并显示一些内容 如果我当前位于该页面上 到目前为止 这就是我所做的并且有效 I am in the blog page 但是 我不想在源代码中硬编码URL 因为如果我传输到另一台服务器 我需
  • 写入 JSON 文件时出现阶段失败 Spark FileAlreadyExistsException

    我正在尝试以 JSON 格式将数据帧写入 s3 位置 但是每当执行器任务失败并且 Spark 重试该阶段时 它就会抛出FileAlreadyExistsException A 类似的问题 https stackoverflow com qu
  • 访问和使用数据库中的 .jsf 文件

    使我的 Web 应用程序能够使用数据库中存储的 JSF 文件的最佳方法是什么 我希望能够动态 在运行时 创建新的 JSF 页面 无需重新部署应用程序即可使用该页面 换句话说 我希望将 JSF 页面的大部分存储在数据库中 并希望 JSF 使用
  • 在 P/Invoke 中为固定字符串传递什么?

    假设这个 C 函数 void do something const char str 它将字符串存储在某处稍后参考 此外 我在 C 中有这个签名来调用这个函数 DllImport NativeLib static extern void d
  • Java 中的窗口拖动事件

    我正在尝试在 Java 中实现类似 OS X 抽屉的功能 因此我将一个窗口隐藏在另一个窗口下 但是 当我拖动主窗口 JFrame 时 我需要在它移动到下面的辅助窗口 JWindow 时发送更新 所以它会是这样的 JFrame JWidow
  • 使用 laravel forge 永远运行 artisan 命令?

    有人可以建议我如何让我的自定义 artisan 命令与守护进程一起永远运行吗 我看过很多关于队列的教程 但它并不完全适合 我正在尝试使用 pubnub 的 php 库完成 订阅 这似乎是最好的方法 除非我错过了一些东西 提前致谢 如果您从命
  • 如何使用 LDAP 组成员身份同步设置 TeamCity [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 这是一个简短的指南 帮助您进行 TeamCity 的 LDAP 设置 在我设法让同步运行之前 我个人经历了相当多的挣扎 默认配置文件有
  • 是否可以在 MATLAB 中实现以下内容?

    给定 5x5 的图像 I i j 4 i j 当 i j 0 1 2 3 4 时 以及以下 Prewitt 运算符 1 0 1 1 0 1 1 0 1 1 1 1 0 0 0 1 1 1 如何计算梯度 幅度和方向 使用 Prewitt 算子
  • ASP.NET Core - 如何注入 IOptionsMonitor

    我怎样才能注射IOptionsMonitor
  • 将 php 与 bigcommerce api 集成

    我是 Bigcommerce Api 整个概念的新手 但我的 php 编程很好 如果我要将我可能创建的 php 代码与 bigcommerce api 集成 我无法确定从哪里开始 我的文件去哪里 他们具体是如何互动的 在 Bigcommer
  • 默认路由总是在react router中执行

    我正在开发一个项目 其中使用了引人注目的Dash 模板 在这里 我在从 URL 更改路由时遇到一些路由问题 auth js import React lazy Suspense from react import Spin from ant
  • CancellationToken 泄漏内存

    我有一个计时器 每 2 秒启动 2 个任务 我在一个简单的列表中跟踪这些任务 这样我可以在停止应用程序时等待它们完成 这些任务有效地进入数据库 运行几次更新并完成 任务本身的运行时间不会超过一秒 global variables to ke