public void ExecutionsDoNotIntersect( ) { ExecutionTokenSpool ets = new ExecutionTokenSpool( ); List <Task> tasks = new List <Task>(5); List <FromToSpan> spans = new List <FromToSpan>(5); for (int i = 0; i < 5; i++) { tasks.Add( Task.Run( async( ) => { FromToSpan span = new FromToSpan( ); using (await ets.GetExecutionToken( )) { span.From = DateTime.Now; await Task.Delay(10); span.To = DateTime.Now; } lock ( spans ) { spans.Add(span); } })); } Task.WaitAll(tasks.ToArray( )); Assert.AreEqual(5, spans.Count); Assert.False(spans.Any(s1 => spans.Any(s2 => s1 != s2 && s1.Intersects(s2)))); }
public bool Intersects(FromToSpan other) { if (To > other.To && From < other.From) { return(true); } if (To > other.From && To < other.From) { return(true); } if (From < other.To && From > other.From) { return(true); } return(false); }