11using System ;
2+ using System . Diagnostics . CodeAnalysis ;
23using System . Threading . Tasks ;
34
45namespace Open . Threading . Tasks
56{
67 public class AsyncQuery < TResult > : AsyncProcess
78 {
8- TResult _latest ;
9+ #if NETSTANDARD2_1
10+ [ AllowNull ]
11+ #endif
12+ TResult _latest = default ! ;
913
10- protected new Func < Progress , TResult > Closure
14+ protected new Func < Progress , TResult > ? Closure
1115 {
1216 get ;
1317 private set ;
1418 }
1519
16- protected Task < TResult > InternalTaskValued
20+ protected Task < TResult > ? InternalTaskValued
1721 {
1822 get ;
1923 private set ;
2024 }
2125
22- public AsyncQuery ( Func < Progress , TResult > query , TaskScheduler scheduler = null )
23- : base ( null , scheduler )
26+ public AsyncQuery ( Func < Progress , TResult > query , TaskScheduler ? scheduler = null )
27+ : base ( scheduler )
2428 {
25- Closure = query ;
29+ Closure = query ?? throw new ArgumentNullException ( nameof ( query ) ) ;
2630 }
2731
2832 protected Task < TResult > EnsureProcessValued ( bool once , TimeSpan ? timeAllowedBeforeRefresh = null )
2933 {
3034
31- Task < TResult > task = null ;
35+ Task < TResult > ? task = null ;
3236
33- SyncLock . ReadWriteConditionalOptimized (
37+ SyncLock ! . ReadWriteConditionalOptimized (
3438 write =>
3539 {
3640 task = InternalTaskValued ;
37- return ( task == null || ! once && ! task . IsActive ( ) ) // No action, or completed?
41+ return ( task is null || ! once && ! task . IsActive ( ) ) // No action, or completed?
3842 && ( ! timeAllowedBeforeRefresh . HasValue // Now?
3943 || timeAllowedBeforeRefresh . Value < DateTime . Now - LatestCompleted ) ; // Or later?
4044 } , ( ) =>
@@ -49,44 +53,45 @@ protected Task<TResult> EnsureProcessValued(bool once, TimeSpan? timeAllowedBefo
4953 ) ;
5054
5155 // action could be null in some cases where timeAllowedBeforeRefresh condition is still met.
52- return task ;
56+ return task ! ;
5357 }
5458
5559 protected override Task EnsureProcess ( bool once , TimeSpan ? timeAllowedBeforeRefresh = null )
56- {
57- return EnsureProcessValued ( once , timeAllowedBeforeRefresh ) ;
58- }
60+ => EnsureProcessValued ( once , timeAllowedBeforeRefresh ) ;
5961
6062 //long _processCount = 0;
63+ #if NETSTANDARD2_1
64+ [ return : MaybeNull ]
65+ #endif
6166 protected new TResult Process ( object progress )
6267 {
6368
6469 var p = ( Progress ) progress ;
6570 try
6671 {
6772 //Contract.Assert(Interlocked.Increment(ref _processCount) == 1);
68- var result = Closure ( p ) ;
73+ var result = Closure ! ( p ) ;
6974 Latest = result ;
7075 return result ;
7176 }
7277 catch ( Exception ex )
7378 {
74- SyncLock . Write ( ( ) => LatestCompleted = DateTime . Now ) ;
79+ SyncLock ! . Write ( ( ) => LatestCompleted = DateTime . Now ) ;
7580 p . Failed ( ex . ToString ( ) ) ;
7681 }
7782 //finally
7883 //{
7984 // //Interlocked.Decrement(ref _processCount);
8085 //}
81- return default ;
86+ return default ! ;
8287 }
8388
8489 public bool IsCurrentDataReady
8590 {
8691 get
8792 {
8893 var t = InternalTask ;
89- if ( t == null )
94+ if ( t is null )
9095 return false ;
9196 return ! t . IsActive ( ) ;
9297 }
@@ -124,7 +129,7 @@ protected virtual TResult GetLatest()
124129
125130 public virtual void OverrideLatest ( TResult value , DateTime ? completed = null )
126131 {
127- SyncLock . Write ( ( ) =>
132+ SyncLock ! . Write ( ( ) =>
128133 {
129134 _latest = value ;
130135 LatestCompleted = completed ?? DateTime . Now ;
@@ -134,7 +139,7 @@ public virtual void OverrideLatest(TResult value, DateTime? completed = null)
134139
135140 public virtual void OverrideLatest ( TResult value , Func < TResult , TResult , bool > useNewValueEvaluator , DateTime ? completed = null )
136141 {
137- SyncLock . ReadWriteConditionalOptimized (
142+ SyncLock ! . ReadWriteConditionalOptimized (
138143 ( write ) => useNewValueEvaluator ( _latest , value ) ,
139144 ( ) =>
140145 {
@@ -155,8 +160,8 @@ public TResult Latest
155160
156161 public bool WaitForRunningToComplete ( TimeSpan ? waitForCurrentTimeout = null )
157162 {
158- var task = SyncLock . ReadValue ( ( ) => InternalTaskValued ) ;
159- if ( task == null ) return false ;
163+ var task = SyncLock ! . ReadValue ( ( ) => InternalTaskValued ) ;
164+ if ( task is null ) return false ;
160165 if ( waitForCurrentTimeout . HasValue )
161166 task . Wait ( waitForCurrentTimeout . Value ) ;
162167 else
@@ -169,8 +174,8 @@ public TResult RunningValue
169174 {
170175 get
171176 {
172- var task = SyncLock . ReadValue ( ( ) => InternalTaskValued ) ;
173- return task == null ? GetRunningValue ( ) : task . Result ;
177+ var task = SyncLock ! . ReadValue ( ( ) => InternalTaskValued ) ;
178+ return task is null ? GetRunningValue ( ) : task . Result ;
174179 }
175180 }
176181
@@ -186,17 +191,22 @@ public TResult ActiveRunningValueOrLatestPossible
186191 }
187192 }
188193
189- public virtual bool TryGetLatest ( out TResult latest , out DateTime completed )
194+ public virtual bool TryGetLatest (
195+ #if NETSTANDARD2_1
196+ [ NotNullWhen ( true ) ]
197+ #endif
198+ out TResult latest ,
199+ out DateTime completed )
190200 {
191201 var result = default ( TResult ) ;
192202 var resultComplete = DateTime . MinValue ;
193- var isReady = SyncLock . ReadValue ( ( ) =>
203+ var isReady = SyncLock ! . ReadValue ( ( ) =>
194204 {
195205 result = _latest ;
196206 resultComplete = LatestCompleted ;
197207 return IsLatestAvailable ;
198208 } ) ;
199- latest = result ;
209+ latest = result ! ;
200210 completed = resultComplete ;
201211 return isReady ;
202212 }
@@ -255,7 +265,7 @@ public TResult GetLatestOrRunning(out DateTime completed)
255265 protected override void OnDispose ( )
256266 {
257267 base . OnDispose ( ) ;
258- _latest = default ;
268+ _latest = default ! ;
259269 Closure = null ;
260270 }
261271 }
0 commit comments