public void TestComplexMonitor()
{
this.Test(async() =>
{
object syncObject = new object();
bool waiting = false;
List <string> log = new List <string>();
Task t1 = Task.Run(() =>
{
Monitor.Enter(syncObject);
log.Add("waiting");
waiting = true;
Monitor.Wait(syncObject);
log.Add("received pulse");
Monitor.Exit(syncObject);
});
Task t2 = Task.Run(async() =>
{
while (!waiting)
{
await Task.Delay(1);
}
Monitor.Enter(syncObject);
Monitor.Pulse(syncObject);
log.Add("pulsed");
Monitor.Exit(syncObject);
});
await Task.WhenAll(t1, t2);
string expected = "waiting, pulsed, received pulse";
string actual = string.Join(", ", log);
Specification.Assert(expected == actual, "ControlledMonitor out of order, '{0}' instead of '{1}'", actual, expected);
},
this.GetConfiguration());
}