20
20
// SOFTWARE.
21
21
22
22
using System ;
23
+ using System . Collections . Concurrent ;
23
24
using System . Collections . Generic ;
24
25
using System . Diagnostics . CodeAnalysis ;
25
26
using System . Linq ;
@@ -32,7 +33,7 @@ namespace YamlDotNet.Serialization.Utilities
32
33
internal sealed class TypeConverterCache
33
34
{
34
35
private readonly IYamlTypeConverter [ ] typeConverters ;
35
- private readonly Dictionary < Type , ( bool HasMatch , IYamlTypeConverter TypeConverter ) > cache = new ( ) ;
36
+ private readonly ConcurrentDictionary < Type , ( bool HasMatch , IYamlTypeConverter ? TypeConverter ) > cache = new ( ) ;
36
37
37
38
public TypeConverterCache ( IEnumerable < IYamlTypeConverter > ? typeConverters ) : this ( typeConverters ? . ToArray ( ) ?? Array . Empty < IYamlTypeConverter > ( ) )
38
39
{
@@ -51,18 +52,15 @@ public TypeConverterCache(IYamlTypeConverter[] typeConverters)
51
52
/// <returns><see langword="true"/> if a type converter was found; <see langword="false"/> otherwise.</returns>
52
53
public bool TryGetConverterForType ( Type type , [ NotNullWhen ( true ) ] out IYamlTypeConverter ? typeConverter )
53
54
{
54
- if ( cache . TryGetValue ( type , out var result ) )
55
+ var result = cache . GetOrAdd ( type , ( t ) =>
55
56
{
56
- typeConverter = result . TypeConverter ;
57
- return result . HasMatch ;
58
- }
59
-
60
- typeConverter = LookupTypeConverter ( type ) ;
61
-
62
- var found = typeConverter is not null ;
63
- cache [ type ] = ( found , typeConverter ! ) ;
57
+ var converter = LookupTypeConverter ( type ) ;
58
+ var found = converter != null ;
59
+ return ( found , converter ) ;
60
+ } ) ;
64
61
65
- return found ;
62
+ typeConverter = result . TypeConverter ;
63
+ return result . HasMatch ;
66
64
}
67
65
68
66
/// <summary>
0 commit comments