c# - CryptoAPITransform 使用正确吗?内存泄漏

标签 c# .net windows vb.net cryptography

我已将一段使用 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/

相关文章:

c# - 构造函数中的 WinRT 异步数据加载

c# - 如何从其他表单访问列表

c# - 具有多种类型的列表

asp.net - 托管在 Windows 容器中的应用程序的 Windows 身份验证

c++ - 如何将 C++ 对象传递给 NPAPI 插件?

java - 即使在用户注销后仍在 Windows 中运行 Java 进程

c# - Xpath 节点选择 - 如何选择 2 个不同的元素?

C#/IronPython Interop 和 "float"数据类型

.net - 如何调试 .NET 远程调用?

c# - 使用 .NET DataSet 的正确方法是什么?