@@ -62,11 +62,12 @@ public virtual void Set<T>(T state, string name = null, bool neverExpires = fals
6262 // add new entry
6363 var duration = neverExpires ? TimeSpan . Zero : TimeSpan . FromMinutes ( 15 ) ;
6464 var policy = new CacheItemPolicy { SlidingExpiration = duration } ;
65+ var key = BuildKey < T > ( name ) ;
6566
6667 // On expiration or removal: remove corresponding cancel token also.
67- policy . RemovedCallback = ( x ) => RemoveCancelTokenSource < T > ( name ) ;
68+ policy . RemovedCallback = ( x ) => OnRemoveCancelTokenSource ( key ) ;
6869
69- _states . Set ( BuildKey < T > ( name ) , new AsyncStateInfo { Progress = state , Duration = duration } , policy ) ;
70+ _states . Set ( key , new AsyncStateInfo { Progress = state , Duration = duration } , policy ) ;
7071 }
7172 }
7273
@@ -88,19 +89,26 @@ public virtual void Update<T>(Action<T> update, string name = null)
8889
8990 public virtual bool Remove < T > ( string name = null )
9091 {
91- var value = _states . Remove ( BuildKey < T > ( name ) ) ;
92+ var key = BuildKey < T > ( name ) ;
9293
93- if ( value != null )
94+ if ( OnRemoveStateInfo ( key ) )
9495 {
95- RemoveCancelTokenSource < T > ( name ) ;
96+ OnRemoveCancelTokenSource ( key ) ;
97+ return true ;
9698 }
9799
98100 return false ;
99101 }
100102
101- protected bool RemoveCancelTokenSource < T > ( string name = null )
103+ protected virtual bool OnRemoveStateInfo ( string key )
102104 {
103- var key = BuildKey < T > ( name ) ;
105+ return _states . Remove ( key ) != null ;
106+ }
107+
108+ protected virtual bool OnRemoveCancelTokenSource ( string key , bool successive = false )
109+ {
110+ Guard . NotEmpty ( key , nameof ( key ) ) ;
111+
104112 var token = _cancelTokens . Remove ( key ) as CancellationTokenSource ;
105113
106114 if ( token != null )
@@ -113,9 +121,15 @@ protected bool RemoveCancelTokenSource<T>(string name = null)
113121 }
114122
115123
116- public virtual CancellationTokenSource GetCancelTokenSource < T > ( string name = null )
124+ public CancellationTokenSource GetCancelTokenSource < T > ( string name = null )
117125 {
118- var key = BuildKey < T > ( name ) ;
126+ return OnGetCancelTokenSource ( BuildKey < T > ( name ) ) ;
127+ }
128+
129+ protected virtual CancellationTokenSource OnGetCancelTokenSource ( string key , bool successive = false )
130+ {
131+ Guard . NotEmpty ( key , nameof ( key ) ) ;
132+
119133 var token = _cancelTokens . Get ( key ) ;
120134
121135 if ( token != null )
@@ -130,18 +144,26 @@ public virtual void SetCancelTokenSource<T>(CancellationTokenSource cancelTokenS
130144 {
131145 Guard . NotNull ( cancelTokenSource , nameof ( cancelTokenSource ) ) ;
132146
133- RemoveCancelTokenSource < T > ( name ) ;
147+ var key = BuildKey < T > ( name ) ;
134148
135- var state = GetStateInfo < T > ( name ) ;
149+ OnRemoveCancelTokenSource ( key ) ;
136150
151+ var state = GetStateInfo < T > ( name ) ;
137152 var policy = new CacheItemPolicy { SlidingExpiration = state != null ? state . Duration : TimeSpan . FromMinutes ( 15 ) } ;
138153
139- _cancelTokens . Set ( BuildKey < T > ( name ) , cancelTokenSource , policy ) ;
154+ _cancelTokens . Set ( key , cancelTokenSource , policy ) ;
140155 }
141156
142- public virtual bool Cancel < T > ( string name = null )
157+ public bool Cancel < T > ( string name = null )
143158 {
144- var cts = GetCancelTokenSource < T > ( name ) ;
159+ return OnCancel ( BuildKey < T > ( name ) ) ;
160+ }
161+
162+ protected virtual bool OnCancel ( string key , bool successive = false )
163+ {
164+ Guard . NotEmpty ( key , nameof ( key ) ) ;
165+
166+ var cts = OnGetCancelTokenSource ( key ) ;
145167
146168 if ( cts != null )
147169 {
@@ -174,7 +196,7 @@ protected string BuildKey<T>(string name)
174196
175197 protected virtual string BuildKey ( Type type , string name )
176198 {
177- return "{0}: {1}:{2} " . FormatInvariant ( "AsyncStateKey" , type . FullName , name . EmptyNull ( ) ) ;
199+ return "{0}{1}" . FormatInvariant ( type . FullName , name . HasValue ( ) ? ":" + name : "" ) ;
178200 }
179201 }
180202}
0 commit comments