using System.Threading.Tasks;
using System.Diagnostics;
public void LocalHandler(object sender, ChimeEventArgs e)
Console.WriteLine(e.Message);
ClockTower clock = new ClockTower(new Random().Next(10, 1001));
clock.OnChime += new ClockTower.ChimeEventHandler(LocalHandler);
public sealed class ClockTower
private readonly Stopwatch _stopWatch = new Stopwatch();
private readonly int _delayMilliseconds;
public ClockTower(int delayMilliseconds)
_delayMilliseconds = delayMilliseconds;
public delegate void ChimeEventHandler(object sender, ChimeEventArgs e);
public event ChimeEventHandler OnChime;
public async void DelayedChime()
await Task.Delay(_delayMilliseconds);
OnChime(this, new ChimeEventArgs(_stopWatch.ElapsedMilliseconds));
await Task.Delay(_delayMilliseconds);
OnChime(this, new ChimeEventArgs(_stopWatch.ElapsedMilliseconds));
public class ChimeEventArgs
public ChimeEventArgs(long milliseconds)
Message = String.Format("The clock chimed after {0} seconds", milliseconds / 1000M);
public string Message { get; set; }