Skip to content

Instantly share code, notes, and snippets.

@rssoft2
Last active April 15, 2019 13:38
Show Gist options
  • Select an option

  • Save rssoft2/f4ec017eda1c96bd1b308c2f931ee59c to your computer and use it in GitHub Desktop.

Select an option

Save rssoft2/f4ec017eda1c96bd1b308c2f931ee59c to your computer and use it in GitHub Desktop.
showing deterministic (serial) execution behaviour of async-task event handler
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");
}
}
}
}
@rssoft2
Copy link
Author

rssoft2 commented Apr 15, 2019

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment