using System.Threading.Tasks;
using System.Diagnostics;
ClockTower cTower = new ClockTower(100);
cTower.OnChime += ClockTowerChimed;
private void ClockTowerChimed(object sender, ChimeEventArgs e)
Console.WriteLine(e.Message);
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; }