3232/********************************************************************************/
3333
3434using System ;
35- using System . Collections . Generic ;
35+ using System . Collections . Concurrent ;
3636using System . IO ;
3737using System . Runtime . InteropServices ;
3838using System . Security . Cryptography ;
@@ -43,7 +43,7 @@ namespace DFe.Utils.Assinatura
4343{
4444 public static class CertificadoDigital
4545 {
46- private static readonly Dictionary < string , X509Certificate2 > CacheCertificado = new Dictionary < string , X509Certificate2 > ( ) ;
46+ private static readonly ConcurrentDictionary < string , X509Certificate2 > CacheCertificado = new ConcurrentDictionary < string , X509Certificate2 > ( ) ;
4747
4848 #region Métodos privados
4949
@@ -204,29 +204,29 @@ private static X509Certificate2 ObterDadosCertificado(ConfiguracaoCertificado co
204204 /// <summary>
205205 /// Obtém um objeto contendo o certificado digital
206206 /// <para>Se for informado <see cref="ConfiguracaoCertificado.Arquivo"/>,
207- /// o certificado digital será obtido pelo método <see cref="ObterDeArquivo(string,string)"/>,
208- /// senão será obtido pelo método <see cref="ListareObterDoRepositorio "/> </para>
207+ /// o certificado digital será obtido pelo método <see cref="ObterDeArquivo(string,string,X509KeyStorageFlags )"/>,
208+ /// senão será obtido pelo método <see cref="ObterDoRepositorio "/> </para>
209209 /// <para>Para liberar os recursos do certificado, após seu uso, invoque o método <see cref="X509Certificate2.Reset()"/></para>
210210 /// </summary>
211211 public static X509Certificate2 ObterCertificado ( ConfiguracaoCertificado configuracaoCertificado )
212212 {
213213 if ( ! configuracaoCertificado . ManterDadosEmCache )
214214 return ObterDadosCertificado ( configuracaoCertificado ) ;
215215
216- if ( ! string . IsNullOrEmpty ( configuracaoCertificado . CacheId ) && CacheCertificado . ContainsKey ( configuracaoCertificado . CacheId ) )
217- return CacheCertificado [ configuracaoCertificado . CacheId ] ;
216+ if ( ! string . IsNullOrWhiteSpace ( configuracaoCertificado . CacheId ) && CacheCertificado . TryGetValue ( configuracaoCertificado . CacheId , out var certificadoEmCache ) )
217+ return certificadoEmCache ;
218218
219219 var certificado = ObterDadosCertificado ( configuracaoCertificado ) ;
220220
221- var keyCertificado = string . IsNullOrEmpty ( configuracaoCertificado . CacheId )
221+ var keyCertificado = string . IsNullOrWhiteSpace ( configuracaoCertificado . CacheId )
222222 ? certificado . SerialNumber
223223 : configuracaoCertificado . CacheId ;
224224
225225 configuracaoCertificado . CacheId = keyCertificado ;
226+
227+ var certificadoDoCache = CacheCertificado . GetOrAdd ( keyCertificado , certificado ) ;
226228
227- CacheCertificado . Add ( keyCertificado , certificado ) ;
228-
229- return CacheCertificado [ keyCertificado ] ;
229+ return certificadoDoCache ;
230230 }
231231
232232 public static void ClearCache ( )
0 commit comments