【问题标题】:Correct CryptoAPITransform use? Memory leak正确使用 CryptoAPITransform?内存泄漏
【发布时间】:2012-03-19 19:20:04
【问题描述】:

我已将一段使用 Crypto API 的旧非托管代码移植到 100% 托管的 .NET 代码。该代码使用 DES 算法,出于多种原因必须对其进行维护。

由于从 CreateDecryptor 和 CreateEncryptor 方法获得的 CryptoAPITransform 实例被标记为可重用,我想只创建它们的实例并在需要时使用它们。

似乎代码有效,但它导致了内存泄漏,因此决定每次都创建和释放一个实例。到目前为止,它似乎没有泄漏,但我想知道我以前是否使用过它,如果是,我是否可以重用这些实例。

该应用程序是多线程的,并且同时进行大量操作,因此可能存在线程问题,尽管我无法找到任何异常或损坏的消息。此外,我所有的操作都是通过调用TransformFinalBlock 进行的。这听起来对你吗?测试应用程序很乏味,但我想如果同步线程可以阻止泄漏,我会自己尝试。

【问题讨论】:

    标签: c# .net windows vb.net cryptography


    【解决方案1】:

    这很可能是与线程相关的错误。来自the documentation on CryptoAPITransform

    此类型的任何公共静态(在 Visual Basic 中为共享)成员都是 线程安全。不保证任何实例成员都是线程 安全。

    查看“线程安全”文档对于您在线程之间共享其实例的所有类的重要性再怎么强调也不为过。

    我的猜测是,在这种情况下,类的实现依赖于某些状态来正确使用/处置非托管代码,并且在多个线程中使用它们会导致无法正确处置这些代码。

    当然,所有这些都是猜测。不知道这个类内部是怎么实现的。

    【讨论】:

    • 我昨天可以在你回答之前测试线程场景,并确认这是内存泄漏的根本原因。无论如何,就目前而言,在没有进行更多测试的情况下,最后我决定每次都创建一个新实例,在某些极端情况下同步调用更昂贵,尽管其他情况更好。另外,我在来这里之前阅读了 MSDN 入门方式,但这些年来我不太相信那种信息,更喜欢听其他开发人员的意见。
    • 哦,在你信任我之前,你应该信任 MSDN 文档 long :-)
    猜你喜欢
    • 2015-03-04
    • 2013-01-11
    • 2015-04-27
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多