77 using Microsoft . Extensions . Logging ;
88 using Microsoft . Extensions . DependencyInjection ;
99
10- public abstract class TaskBase < TState > : ITask where TState : TaskStatus , new ( )
10+ public abstract class TaskBase < TRunStatus > : ITask where TRunStatus : TaskRunStatus , new ( )
1111 {
1212 private static readonly Random Random = new Random ( ) ;
1313
@@ -25,12 +25,12 @@ public TaskBase(ILoggerFactory loggerFactory, TimeSpan interval, IServiceScopeFa
2525 Logger = loggerFactory . CreateLogger ( this . GetType ( ) . FullName ) ;
2626 Interval = interval ;
2727 ServiceScopeFactory = serviceScopeFactory ;
28- Status = new TState ( ) ;
28+ RunStatus = new TRunStatus ( ) ;
2929 }
3030
31- TaskStatus ITask . Status { get { return Status ; } }
31+ TaskRunStatus ITask . RunStatus { get { return RunStatus ; } }
3232
33- public TState Status { get ; private set ; }
33+ public TRunStatus RunStatus { get ; protected set ; }
3434
3535 public bool IsStarted
3636 {
@@ -96,11 +96,11 @@ protected void MainLoop(TimeSpan initialTimeout)
9696 while ( true )
9797 {
9898 Logger . LogDebug ( "Sleeping for {0}..." , sleepInterval ) ;
99- Status . NextRunTime = DateTimeOffset . Now . Add ( sleepInterval ) ;
99+ RunStatus . NextRunTime = DateTimeOffset . Now . Add ( sleepInterval ) ;
100100 var signaled = WaitHandle . WaitAny ( events , sleepInterval ) ;
101- if ( signaled == 0 ) // индекс сработавшего. нулевой это breakEvent
101+ if ( signaled == 0 ) // index of signalled. zero is for ' breakEvent'
102102 {
103- // значит закругляемся
103+ // must stop and quit
104104 Logger . LogWarning ( "BreakEvent is set, stopping..." ) ;
105105 mainTask = null ;
106106 break ;
@@ -122,29 +122,38 @@ protected void MainLoop(TimeSpan initialTimeout)
122122
123123 try
124124 {
125+ OnBeforeRun ( ) ;
126+
125127 IsRunningRightNow = true ;
126128
127- Status . LastRunTime = DateTimeOffset . Now ;
129+ RunStatus . LastRunTime = DateTimeOffset . Now ;
128130
129131 Logger . LogInformation ( "Calling Run()..." ) ;
130- Run ( scope . ServiceProvider , Status ) ;
132+ Run ( scope . ServiceProvider , RunStatus ) ;
131133 Logger . LogInformation ( "Done." ) ;
132134
133- Status . LastRunResult = TaskRunResult . Success ;
134- Status . LastSuccessTime = DateTimeOffset . Now ;
135- Status . FirstFail = DateTimeOffset . MinValue ;
136- Status . FailsCount = 0 ;
135+ RunStatus . LastResult = TaskRunResult . Success ;
136+ RunStatus . LastSuccessTime = DateTimeOffset . Now ;
137+ RunStatus . FirstFailTime = DateTimeOffset . MinValue ;
138+ RunStatus . FailsCount = 0 ;
139+ RunStatus . LastException = null ;
140+ IsRunningRightNow = false ;
141+
142+ OnAfterRunSuccess ( ) ;
137143 }
138144 catch ( Exception ex )
139145 {
140- Logger . LogWarning ( "Ooops, error (ignoring):" , ex ) ;
141- Status . LastRunResult = TaskRunResult . Fail ;
142- Status . LastException = ex ;
143- if ( Status . FailsCount == 0 )
146+ Logger . LogWarning ( "Ooops, error (ignoring, see RunStatus.LastException ):" , ex ) ;
147+ RunStatus . LastResult = TaskRunResult . Fail ;
148+ RunStatus . LastException = ex ;
149+ if ( RunStatus . FailsCount == 0 )
144150 {
145- Status . FirstFail = DateTimeOffset . Now ;
151+ RunStatus . FirstFailTime = DateTimeOffset . Now ;
146152 }
147- Status . FailsCount ++ ;
153+ RunStatus . FailsCount ++ ;
154+ IsRunningRightNow = false ;
155+
156+ OnAfterRunFail ( ) ;
148157 }
149158 finally
150159 {
@@ -156,6 +165,30 @@ protected void MainLoop(TimeSpan initialTimeout)
156165 Logger . LogInformation ( "MainLoop() finished." ) ;
157166 }
158167
159- protected abstract void Run ( IServiceProvider serviceProvider , TState state ) ;
168+ protected abstract void Run ( IServiceProvider serviceProvider , TRunStatus runStatus ) ;
169+
170+ /// <summary>
171+ /// Called before Run() is called (even before IsRunningRightNow set to true)
172+ /// </summary>
173+ protected virtual void OnBeforeRun ( )
174+ {
175+ // nothing
176+ }
177+
178+ /// <summary>
179+ /// Called after Run() sucessfully finished (after IsRunningRightNow set to false)
180+ /// </summary>
181+ protected virtual void OnAfterRunSuccess ( )
182+ {
183+ // nothing
184+ }
185+
186+ /// <summary>
187+ /// Called after Run() falied (after IsRunningRightNow set to false)
188+ /// </summary>
189+ protected virtual void OnAfterRunFail ( )
190+ {
191+ // nothing
192+ }
160193 }
161194}
0 commit comments