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 async Task MostBasicTest( ) { ExecutionTokenSpool ets = new ExecutionTokenSpool( ); using (await ets.GetExecutionToken( )) { // nop } }
public void ExceptionOnDisposedSpool( ) { ExecutionTokenSpool ets = new ExecutionTokenSpool( ); Task[] tasks = new Task[2]; TaskCompletionSource <object> tcs1 = new TaskCompletionSource <object>( ); TaskCompletionSource <object> tcs2 = new TaskCompletionSource <object>( ); Task[] syncTasks = { tcs1.Task, tcs2.Task }; AutoResetEvent resetEvent = new AutoResetEvent(false); tasks[0] = Task.Run( async( ) => { tcs1.SetResult(null); using (await ets.GetExecutionToken( )) { resetEvent.WaitOne( ); } }); tasks[1] = Task.Run( async( ) => { tcs2.SetResult(null); using (await ets.GetExecutionToken( )) { // nop } }); Task.WaitAll(syncTasks); ets.Dispose( ); resetEvent.Set( ); AggregateException exc = null; try { Task.WaitAll(tasks.ToArray( )); } catch (AggregateException exc2) { exc = exc2; } Assert.NotNull(exc); Assert.AreEqual(1, exc.InnerExceptions.Count); Assert.AreEqual(typeof(ExecutionTokenSpoolDisposedException), exc.InnerExceptions.First( ).GetType( )); }