3030//---------------------------------------------------------------------------
3131
3232using System ;
33- using System . Collections . Generic ;
33+ using System . Collections . Concurrent ;
3434using System . Diagnostics . Tracing ;
3535using System . Timers ;
3636
@@ -59,11 +59,13 @@ public class TimerBasedCredentialRefresherEventSource : EventSource
5959 public void TriggeredTimer ( string name ) => WriteEvent ( 4 , "TriggeredTimer" , name ) ;
6060 [ Event ( 5 ) ]
6161 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 ) ;
6264 }
6365
6466 public class TimerBasedCredentialRefresher : ICredentialsRefresher
6567 {
66- private Dictionary < ICredentialsProvider , Timer > _registrations = new Dictionary < ICredentialsProvider , Timer > ( ) ;
68+ private readonly ConcurrentDictionary < ICredentialsProvider , Timer > _registrations = new ConcurrentDictionary < ICredentialsProvider , Timer > ( ) ;
6769
6870 public ICredentialsProvider Register ( ICredentialsProvider provider , NotifyCredentialRefreshed callback )
6971 {
@@ -72,25 +74,31 @@ public ICredentialsProvider Register(ICredentialsProvider provider, NotifyCreden
7274 return provider ;
7375 }
7476
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+
7786 return provider ;
7887 }
7988
8089 public bool Unregister ( ICredentialsProvider provider )
8190 {
82- if ( ! _registrations . ContainsKey ( provider ) )
91+ if ( _registrations . TryRemove ( provider , out Timer timer ) )
8392 {
84- return false ;
85- }
86-
87- var timer = _registrations [ provider ] ;
88- if ( timer != null )
89- {
90- TimerBasedCredentialRefresherEventSource . Log . Unregistered ( provider . Name ) ;
91- timer . Stop ( ) ;
92- _registrations . Remove ( provider ) ;
93- timer . Dispose ( ) ;
93+ try
94+ {
95+ TimerBasedCredentialRefresherEventSource . Log . Unregistered ( provider . Name ) ;
96+ timer . Stop ( ) ;
97+ }
98+ finally
99+ {
100+ timer . Dispose ( ) ;
101+ }
94102 return true ;
95103 }
96104 else
0 commit comments