我已将一段使用 Crypto API 的旧非托管代码移植到 100% 托管 .NET 代码。该代码使用了 DES 算法,由于多种原因必须对其进行维护。
由于从 CreateDecryptor 和 CreateEncryptor 方法获取的 CryptoAPITransform
实例被标记为可重用,因此我想到只创建它们的实例并在需要时使用它们。
代码似乎有效,但它导致内存泄漏,因此决定每次创建并处置一个实例。到目前为止,它似乎没有泄漏,但我想知道我之前是否使用错误,如果是,我是否可以重用这些实例。
该应用程序是多线程的,并且同时进行大量操作,因此可能存在线程问题,尽管我无法找到任何异常或损坏的消息。另外,我的所有操作都是通过调用 TransformFinalBlock 来完成的。您觉得这听起来合适吗?测试应用程序很乏味,但我想如果同步线程可以阻止泄漏,我想我会自己尝试一下。
最佳答案
这很可能是一个与线程相关的错误。来自 the documentation on CryptoAPITransform :
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
对于在线程之间共享其实例的所有类,查看“线程安全”文档的重要性怎么强调都不为过。
我的猜测是,在这种情况下,类的实现依赖于某种状态来正确使用/处置非托管代码,并且通过在多个线程中使用它们,您将导致无法正确处置这些代码。
当然,所有这些都是猜测。我不知道这个类内部是如何实现的。
关于c# - CryptoAPITransform 使用正确吗?内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9776466/