30
30
//---------------------------------------------------------------------------
31
31
32
32
using System ;
33
- using System . Collections . Generic ;
33
+ using System . Collections . Concurrent ;
34
34
using System . Diagnostics . Tracing ;
35
35
using System . Timers ;
36
36
@@ -59,11 +59,13 @@ public class TimerBasedCredentialRefresherEventSource : EventSource
59
59
public void TriggeredTimer ( string name ) => WriteEvent ( 4 , "TriggeredTimer" , name ) ;
60
60
[ Event ( 5 ) ]
61
61
public void RefreshedCredentials ( string name , bool succesfully ) => WriteEvent ( 5 , "RefreshedCredentials" , name , succesfully ) ;
62
+ [ Event ( 6 ) ]
63
+ public void AlreadyRegistered ( string name ) => WriteEvent ( 6 , "AlreadyRegistered" , name ) ;
62
64
}
63
65
64
66
public class TimerBasedCredentialRefresher : ICredentialsRefresher
65
67
{
66
- private Dictionary < ICredentialsProvider , Timer > _registrations = new Dictionary < ICredentialsProvider , Timer > ( ) ;
68
+ private readonly ConcurrentDictionary < ICredentialsProvider , Timer > _registrations = new ConcurrentDictionary < ICredentialsProvider , Timer > ( ) ;
67
69
68
70
public ICredentialsProvider Register ( ICredentialsProvider provider , NotifyCredentialRefreshed callback )
69
71
{
@@ -72,8 +74,15 @@ public ICredentialsProvider Register(ICredentialsProvider provider, NotifyCreden
72
74
return provider ;
73
75
}
74
76
75
- _registrations . Add ( provider , scheduleTimer ( provider , callback ) ) ;
76
- TimerBasedCredentialRefresherEventSource . Log . Registered ( provider . Name ) ;
77
+ if ( _registrations . TryAdd ( provider , scheduleTimer ( provider , callback ) ) )
78
+ {
79
+ TimerBasedCredentialRefresherEventSource . Log . Registered ( provider . Name ) ;
80
+ }
81
+ else
82
+ {
83
+ TimerBasedCredentialRefresherEventSource . Log . AlreadyRegistered ( provider . Name ) ;
84
+ }
85
+
77
86
return provider ;
78
87
}
79
88
@@ -84,12 +93,12 @@ public bool Unregister(ICredentialsProvider provider)
84
93
return false ;
85
94
}
86
95
87
- var timer = _registrations [ provider ] ;
96
+ Timer timer = _registrations [ provider ] ;
88
97
if ( timer != null )
89
98
{
90
99
TimerBasedCredentialRefresherEventSource . Log . Unregistered ( provider . Name ) ;
91
100
timer . Stop ( ) ;
92
- _registrations . Remove ( provider ) ;
101
+ _registrations . TryRemove ( provider , out _ ) ;
93
102
timer . Dispose ( ) ;
94
103
return true ;
95
104
}
0 commit comments