X509Certificate2 类是线程安全的吗?

问题描述 投票:0回答:2

告诉我 X509Certificate2 类是线程安全的吗?有条件的话我可以这样用:

public class MyClass 
{
    // example
    private static readonly X509Certificate2 staticCertInstance = 
        new X509Certificate2("cert.pfx");

    // the method can be called from different threads
    public void Execute() 
    {
        // use staticCertInstance 
    }
}

避免每次都创建实例,从而减少GC的负载?

c# thread-safety
2个回答
1
投票

这个对象不能保证线程安全,因为它有一个“handle”方法,它本身就是一个包装器并使用较低级别的函数。

如果您使用的是 .NET 4.6+,您应该将对象包装在 using 语句中以正确处理它,否则您可能会发现将小证书复制到磁盘到多个位置时出现问题。

因此,如果您不确定,请使用“lock”关键字和“using”语句。


0
投票

根据 此 GitHub 问题

X509Certificates
是不可变的,并且它们的变异成员已经过时了,所以如果我是你我就不会担心。但我不是100%确定。

从技术上讲,有一点可变性:Dispose()。如果在另一个线程处理 X509Cerificate{2} 时正在读取它,则 X509Cerificate{2} 的行为是未定义的。只要您注意在使用时不要丢弃它,我相信从多个线程读取它就可以了。我怀疑已经编写了大量代码来依赖于证书的多线程可读性。

简而言之:只要你不

Dispose
它,跨多个线程重用应该是安全的。

© www.soinside.com 2019 - 2024. All rights reserved.