@@ -419,6 +419,35 @@ public async Task ShouldCompleteStoppedTaskWhenStopCompleted()
419419 stageOrder . Should ( ) . Equal ( expectedStageOrder ) ;
420420 }
421421
422+ [ Fact ]
423+ public async Task ShouldCancelStoppedTokenWhenStopCompleted ( )
424+ {
425+ var stageOrder = new List < string > ( ) ;
426+ var actor = CreateActor ( x =>
427+ {
428+ x . StartWork = new ActorStartWork ( ( ) => stageOrder . Add ( "Start" ) ) ;
429+ x . StopWork = new ActorStopWork (
430+ ( ) =>
431+ {
432+ Thread . Sleep ( TimeSpan . FromMilliseconds ( 250 ) ) ;
433+ stageOrder . Add ( "Stop" ) ;
434+ } ) ;
435+ } ,
436+ ActorCreateOptions . None ) ;
437+
438+ await actor . Start ( ) ;
439+
440+ var cancelledPromise = new TaskCompletionSource < object > ( ) ;
441+
442+ var cancellationRegistrationToken = actor . StoppedToken ( ) . Register ( ( ) => cancelledPromise . SetResult ( null ) ) ;
443+
444+ await actor . Stop ( ) ;
445+
446+ cancelledPromise . Task . Wait ( TimeSpan . FromMilliseconds ( 1000 ) ) . Should ( ) . BeTrue ( ) ;
447+
448+ cancellationRegistrationToken . Dispose ( ) ;
449+ }
450+
422451 [ Theory ]
423452 [ InlineData ( ResumeTestCase . AwaitOnTaskFactoryScheduledTask , StopWorkOutcome . Completes ) ]
424453 [ InlineData ( ResumeTestCase . AwaitOnTaskFactoryScheduledTask , StopWorkOutcome . Faults ) ]
@@ -446,27 +475,23 @@ public void ShouldNotBeAbleToResumeWorkAfterStop(ResumeTestCase resumeTestCase,
446475 "PostTriggerWait"
447476 } ;
448477
478+ Func < int > offActorWork =
479+ ( ) =>
480+ {
481+ stages . Add ( "PreTriggerWait" ) ;
482+ pretrigger . SetResult ( true ) ;
483+ ThrowIfWaitTimesOut ( trigger . Task ) ;
484+ stages . Add ( "PostTriggerWait" ) ;
485+ return 345 ;
486+ } ;
487+
449488 switch ( resumeTestCase )
450489 {
451490 case ResumeTestCase . AwaitOnSecondActor :
452- suspendWork = ( ) => actor2 . Enqueue ( ( ) =>
453- {
454- stages . Add ( "PreTriggerWait" ) ;
455- pretrigger . SetResult ( true ) ;
456- ThrowIfWaitTimesOut ( trigger . Task ) ;
457- stages . Add ( "PostTriggerWait" ) ;
458- return 345 ;
459- } ) ;
491+ suspendWork = ( ) => actor2 . Enqueue ( offActorWork ) ;
460492 break ;
461493 case ResumeTestCase . AwaitOnTaskFactoryScheduledTask :
462- suspendWork = ( ) => new TaskFactory ( TaskScheduler . Default ) . StartNew ( ( ) =>
463- {
464- stages . Add ( "PreTriggerWait" ) ;
465- pretrigger . SetResult ( true ) ;
466- ThrowIfWaitTimesOut ( trigger . Task ) ;
467- stages . Add ( "PostTriggerWait" ) ;
468- return 345 ;
469- } ) ;
494+ suspendWork = ( ) => new TaskFactory ( TaskScheduler . Default ) . StartNew ( offActorWork ) ;
470495 break ;
471496 default :
472497 throw new Exception ( $ "Unhandled test case { resumeTestCase } .") ;
@@ -755,7 +780,7 @@ public void ShouldNotBeAbleToSpecifyStopWorkOnceActorStarted()
755780 [ Theory ]
756781 [ InlineData ( true ) ]
757782 [ InlineData ( false ) ]
758- public void ShouldBeAbleToCancelAnyEnqueuedWork ( bool delayStart )
783+ public async Task ShouldBeAbleToCancelAnyEnqueuedWork ( bool delayStart )
759784 {
760785 var actor = CreateActor ( delayStart ? ActorCreateOptions . None : ActorCreateOptions . Start ) ;
761786
@@ -802,13 +827,13 @@ public void ShouldBeAbleToCancelAnyEnqueuedWork(bool delayStart)
802827
803828 if ( delayStart )
804829 {
805- actor . Start ( ) ;
830+ await actor . Start ( ) ;
806831 }
807832
808- task1 . AwaitingShouldCompleteIn ( _waitTimeout ) ;
809- task4 . AwaitingShouldCompleteIn ( _waitTimeout ) ;
810- task6 . AwaitingShouldCompleteIn ( _waitTimeout ) ;
811- task8 . AwaitingShouldCompleteIn ( _waitTimeout ) ;
833+ await task1 ;
834+ await task4 ;
835+ await task6 ;
836+ await task8 ;
812837 ShouldBeCancelled ( task2 ) ;
813838 ShouldBeCancelled ( task3 ) ;
814839 ShouldBeCancelled ( task5 ) ;
@@ -993,7 +1018,7 @@ public async Task ShouldBeAbleToPauseActorUntilResumeFromAwaitReturningData(Acto
9931018 }
9941019
9951020 [ Fact ]
996- public async Task ShutdownShouldReturnImmediatelyIfStartWorkFails ( )
1021+ public async Task StopShouldNotRunStopWorkIfStartWorkFails ( )
9971022 {
9981023 var stopWorkCalled = false ;
9991024 var actor =
@@ -1005,11 +1030,8 @@ public async Task ShutdownShouldReturnImmediatelyIfStartWorkFails()
10051030
10061031 actor . Awaiting ( async x => await x . Start ( ) ) . ShouldThrow < Exception > ( ) . WithMessage ( "Error." ) ;
10071032
1008- var stopperThreadId = Thread . CurrentThread . ManagedThreadId ;
1009-
10101033 await actor . Stop ( ) ;
10111034
1012- Thread . CurrentThread . ManagedThreadId . Should ( ) . Be ( stopperThreadId ) ;
10131035 stopWorkCalled . Should ( ) . BeFalse ( ) ;
10141036 }
10151037
0 commit comments