@@ -875,74 +875,86 @@ public void ShouldStopActorAndNotProcessAnyAlreadyEnqueuedWorkIfStartWorkCancell
875875 attempts . Should ( ) . Be ( 0 ) ;
876876 }
877877
878- [ Fact ]
879- public async Task ShouldBeAbleToPauseActorUntilResumeFromAwait ( )
878+ [ Theory ]
879+ [ InlineData ( ActorEnqueueOptions . Default , ActorEnqueueOptions . Default ) ]
880+ [ InlineData ( ActorEnqueueOptions . WorkIsLongRunning , ActorEnqueueOptions . Default ) ]
881+ [ InlineData ( ActorEnqueueOptions . WorkIsLongRunning , ActorEnqueueOptions . WorkIsLongRunning ) ]
882+ [ InlineData ( ActorEnqueueOptions . Default , ActorEnqueueOptions . WorkIsLongRunning ) ]
883+ public async Task ShouldBeAbleToPauseActorUntilResumeFromAwait ( ActorEnqueueOptions awaiterOptions , ActorEnqueueOptions otherOptions )
880884 {
881- var actor = CreateActor ( ) ;
882- var numbers = new List < int > ( ) ;
885+ // Do this repeatedly to try to expose race conditions in the pausing logic
886+ for ( var i = 0 ; i < 1000 ; i ++ )
887+ {
888+ var actor = new Actor ( ) ;
889+ var numbers = new List < int > ( ) ;
883890
884- await actor . Start ( ) ;
891+ await actor . Start ( ) ;
885892
886- var tasks =
887- new [ ]
888- {
893+ var tasks = new Task [ 3 ] ;
894+
895+ tasks [ 0 ] =
889896 actor . Enqueue (
890897 async ( ) =>
891898 {
892- numbers . Add ( 1 ) ;
893-
894- await Task . Delay ( TimeSpan . FromSeconds ( 1 ) ) . WhileActorPaused ( ) ;
895-
896- numbers . Add ( 2 ) ;
897- } ) ,
898- actor . Enqueue ( ( ) => numbers . Add ( 3 ) ) ,
899- actor . Enqueue ( ( ) => numbers . Add ( 4 ) ) ,
900- actor . Enqueue ( ( ) => numbers . Add ( 5 ) )
901- } ;
899+ numbers . Add ( i ) ;
900+ var task = Task . Run ( ( ) => numbers . Add ( i + 1 ) ) ;
901+ await task . WhileActorPaused ( ) ;
902+ numbers . Add ( i + 2 ) ;
903+ } , awaiterOptions ) ;
904+ tasks [ 1 ] = actor . Enqueue ( ( ) => numbers . Add ( i + 3 ) , otherOptions ) ;
905+ tasks [ 2 ] = actor . Enqueue ( ( ) => numbers . Add ( i + 4 ) , otherOptions ) ;
906+
907+ foreach ( var task in tasks )
908+ {
909+ await task ;
910+ }
902911
903- await Task . WhenAll ( tasks ) ;
912+ await actor . Stop ( ) ;
904913
905- numbers . Should ( ) . Equal ( 1 , 2 , 3 , 4 , 5 ) ;
914+ numbers . Should ( ) . Equal ( i , i + 1 , i + 2 , i + 3 , i + 4 ) ;
915+ }
906916 }
907917
908- [ Fact ]
909- public async Task ShouldBeAbleToPauseActorUntilResumeFromAwaitReturningData ( )
918+ [ Theory ]
919+ [ InlineData ( ActorEnqueueOptions . Default , ActorEnqueueOptions . Default ) ]
920+ [ InlineData ( ActorEnqueueOptions . WorkIsLongRunning , ActorEnqueueOptions . Default ) ]
921+ [ InlineData ( ActorEnqueueOptions . WorkIsLongRunning , ActorEnqueueOptions . WorkIsLongRunning ) ]
922+ [ InlineData ( ActorEnqueueOptions . Default , ActorEnqueueOptions . WorkIsLongRunning ) ]
923+ public async Task ShouldBeAbleToPauseActorUntilResumeFromAwaitReturningData ( ActorEnqueueOptions awaiterOptions , ActorEnqueueOptions otherOptions )
910924 {
911- var actor = CreateActor ( ) ;
912- var numbers = new List < int > ( ) ;
913- var promise = new TaskCompletionSource < int > ( ) ;
925+ // Do this repeatedly to try to expose race conditions in the pausing logic
926+ for ( var i = 0 ; i < 1000 ; i ++ )
927+ {
928+ var actor = CreateActor ( ) ;
929+ var numbers = new List < int > ( ) ;
914930
915- await actor . Start ( ) ;
931+ await actor . Start ( ) ;
916932
917- var tasks =
918- new [ ]
919- {
933+ var tasks = new Task [ 4 ] ;
934+
935+ tasks [ 0 ] =
920936 actor . Enqueue (
921- async ( ) =>
922- {
923- numbers . Add ( 1 ) ;
937+ async ( ) =>
938+ {
939+ numbers . Add ( i ) ;
924940
925- var next = await promise . Task . WhileActorPaused ( ) ;
941+ var next = await Task . Run ( ( ) => i + 1 ) . WhileActorPaused ( ) ;
926942
927- numbers . Add ( next ) ;
928- } ) ,
929- actor . Enqueue ( ( ) => numbers . Add ( 3 ) ) ,
930- actor . Enqueue ( ( ) => numbers . Add ( 4 ) ) ,
931- actor . Enqueue ( ( ) => numbers . Add ( 5 ) )
932- } ;
943+ numbers . Add ( next ) ;
944+ } , awaiterOptions ) ;
945+ tasks [ 1 ] = actor . Enqueue ( ( ) => numbers . Add ( i + 2 ) , otherOptions ) ;
946+ tasks [ 2 ] = actor . Enqueue ( ( ) => numbers . Add ( i + 3 ) , otherOptions ) ;
947+ tasks [ 3 ] = actor . Enqueue ( ( ) => numbers . Add ( i + 4 ) , otherOptions ) ;
933948
934- var promiseSetter =
935- Task . Run (
936- async ( ) =>
937- {
938- await Task . Delay ( TimeSpan . FromSeconds ( 1 ) ) ;
939- promise . SetResult ( 2 ) ;
940- } ) ;
949+ foreach ( var task in tasks )
950+ {
951+ await task ;
952+ }
941953
942- await Task . WhenAll ( tasks ) ;
943- await promiseSetter ;
954+ await actor . Stop ( ) ;
944955
945- numbers . Should ( ) . Equal ( 1 , 2 , 3 , 4 , 5 ) ;
956+ numbers . Should ( ) . Equal ( i , i + 1 , i + 2 , i + 3 , i + 4 ) ;
957+ }
946958 }
947959
948960 [ Flags ]
0 commit comments