我已经移植了一段旧的非托管代码,它使用Crypto API来实现100%托管的.NET代码。代码使用DES算法,并且由于几个原因不得不维护它。
由于从CreateDecryptor和CreateEncryptor方法获得的CryptoAPITransform
个实例被标记为可重用,我只想创建它们的实例并在需要时使用它们。
似乎代码工作正常,但它导致内存泄漏,因此决定每次都创建和处理一个实例。到目前为止它似乎没有泄漏,但我想知道我以前是否使用过它,如果是的话,我是否可以重用这些实例。
该应用程序是多线程的,并且同时进行大量操作,因此可能存在线程问题,尽管我无法找到任何异常或损坏的消息。此外,我的所有操作都是通过致电TransformFinalBlock
来完成的。这听起来对你好吗?测试应用程序是繁琐的,但我想我会尝试自己,如果同步线程阻止任何机会泄漏。
答案 0 :(得分:2)
这很可能是与线程相关的错误。来自the documentation on CryptoAPITransform:
此类型的任何公共静态(在Visual Basic中为Shared)成员都是 线程安全。任何实例成员都不能保证是线程 安全
我不能强调查看线程中共享实例的所有类的“线程安全”文档是多么重要。
我的猜测是,在这种情况下,类的实现依赖于一些状态来正确使用/处置非托管代码,并且通过在多个线程中使用它们导致无法正确处置它们。
所有这些都是当然的猜测。我不知道这个类是如何在内部实现的。