Skip to content

Instantly share code, notes, and snippets.

@rofr
Created March 22, 2019 20:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rofr/564828a21492b1c9da4c4a651ead8f55 to your computer and use it in GitHub Desktop.
Save rofr/564828a21492b1c9da4c4a651ead8f55 to your computer and use it in GitHub Desktop.
Event Aggregator DP example
interface IMessageSource
{
event MessageHandler MessagePublished;
}
public delegate void MessageHandler(string message);
class MessageAggregator
{
public event MessageHandler MessagePublished;
public void Add(IMessageSource messageSource)
{
messageSource.MessagePublished += Publish;
}
public void Remove(IMessageSource messageSource)
{
messageSource.MessagePublished -= Publish;
}
private void Publish(string message)
{
try
{
MessagePublished?.Invoke(message);
}
catch (Exception) { }
}
}
class Source : IMessageSource
{
private string _message;
public event MessageHandler MessagePublished;
public Source(string message)
{
_message = message;
}
public async Task Ponder()
{
var rnd = new Random();
await Task.Run(async () =>
{
for (int i = 0; i < 10; i++)
{
await Task.Delay(TimeSpan.FromMilliseconds(rnd.Next(2000)));
MessagePublished?.Invoke(i + ":" + _message);
}
});
}
}
class MessageConsumer
{
static void Main(string[] args)
{
var aggregator = new MessageAggregator();
aggregator.MessagePublished += Handle;
var arnold = new Source("Hasta la vista baby");
aggregator.Add(arnold);
var robin = new Source("Holy cobwebs, Batman");
aggregator.Add(robin);
var djt = new Source("I want a wall and I want it now");
aggregator.Add(djt);
Task.WhenAll(arnold.Ponder(), robin.Ponder(), djt.Ponder())
.GetAwaiter()
.GetResult();
}
private static void Handle(string message)
{
Console.WriteLine("Message received: " + message);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment