Last active
April 15, 2019 13:38
-
-
Save rssoft2/f4ec017eda1c96bd1b308c2f931ee59c to your computer and use it in GitHub Desktop.
showing deterministic (serial) execution behaviour of async-task event handler
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System; | |
| using System.Collections.Generic; | |
| using System.Threading.Tasks; | |
| using NUnit.Framework; | |
| namespace Frank.AsyncVoid.Trials | |
| { | |
| [Explicit] | |
| public class AsyncAwaitEventHandlerTests | |
| { | |
| private static readonly Random Random = new Random(); | |
| [Test] | |
| public async Task Firing10Events_ThreeAsyncSubscribersWithDifferentExecutionTime_ShowsAsyncAwaitBehaviour() | |
| { | |
| IEnumerable<IPlatformMessageContractHandler> handlers = new[] | |
| { | |
| GetHandler("A"), | |
| GetHandler("B"), | |
| GetHandler("C") | |
| }; | |
| Console.WriteLine("Start firing 10 events"); | |
| for (var i = 0; i < 10; i++) | |
| await RunHandlersAsync(handlers, i); | |
| Console.WriteLine("Finished firing 10 events"); | |
| } | |
| private static async Task RunHandlersAsync(IEnumerable<IPlatformMessageContractHandler> handlers, int i) | |
| { | |
| foreach (var handler in handlers) | |
| await handler.HandleAsync(i).ConfigureAwait(false); | |
| } | |
| private static IPlatformMessageContractHandler GetHandler(string context) | |
| { | |
| return new PlatformMessageContractHandler(context); | |
| } | |
| private interface IPlatformMessageContractHandler | |
| { | |
| Task HandleAsync(int i); | |
| } | |
| private class PlatformMessageContractHandler : IPlatformMessageContractHandler | |
| { | |
| private readonly string _context; | |
| public PlatformMessageContractHandler(string context) | |
| { | |
| _context = context; | |
| } | |
| public async Task HandleAsync(int i) | |
| { | |
| await Task.Delay(Random.Next(100)); | |
| Console.WriteLine($"Handler {_context}: event #{i + 1} done"); | |
| } | |
| } | |
| } | |
| } |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Console Output:
Start firing 10 events
Handler A: event #1 done
Handler B: event #1 done
Handler C: event #1 done
Handler A: event #2 done
Handler B: event #2 done
Handler C: event #2 done
Handler A: event #3 done
Handler B: event #3 done
Handler C: event #3 done
Handler A: event #4 done
Handler B: event #4 done
Handler C: event #4 done
Handler A: event #5 done
Handler B: event #5 done
Handler C: event #5 done
Handler A: event #6 done
Handler B: event #6 done
Handler C: event #6 done
Handler A: event #7 done
Handler B: event #7 done
Handler C: event #7 done
Handler A: event #8 done
Handler B: event #8 done
Handler C: event #8 done
Handler A: event #9 done
Handler B: event #9 done
Handler C: event #9 done
Handler A: event #10 done
Handler B: event #10 done
Handler C: event #10 done
Finished firing 10 events