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,8 +74,15 @@ 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
@@ -84,12 +93,12 @@ public bool Unregister(ICredentialsProvider provider)
8493 return false ;
8594 }
8695
87- var timer = _registrations [ provider ] ;
96+ Timer timer = _registrations [ provider ] ;
8897 if ( timer != null )
8998 {
9099 TimerBasedCredentialRefresherEventSource . Log . Unregistered ( provider . Name ) ;
91100 timer . Stop ( ) ;
92- _registrations . Remove ( provider ) ;
101+ _registrations . TryRemove ( provider , out _ ) ;
93102 timer . Dispose ( ) ;
94103 return true ;
95104 }
0 commit comments