Ejemplo n.º 1
0
        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))));
        }
Ejemplo n.º 2
0
        public async Task MostBasicTest( )
        {
            ExecutionTokenSpool ets = new ExecutionTokenSpool( );

            using (await ets.GetExecutionToken( )) {
                // nop
            }
        }
Ejemplo n.º 3
0
        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( ));
        }