public void TaskSchedulerIsPreserved() { var executor = new DefaultEventExecutor(); // SingleThreadEventExecutor("test", TimeSpan.FromSeconds(5)); IEnumerable <Task <int> > tasks = Enumerable.Range(1, 1).Select(async i => { //Clear SynchronizationContext set by xunit SynchronizationContext.SetSynchronizationContext(null); var completion = new DefaultPromise(); executor.Execute(async() => { try { Assert.True(executor.InEventLoop); await Task.Delay(1); Assert.True(executor.InEventLoop); completion.TryComplete(); // all is well } catch (Exception ex) { completion.TrySetException(ex); } }); await completion.Task; Assert.False(executor.InEventLoop); return(i); }); Task.WhenAll(tasks).Wait(TimeSpan.FromSeconds(500)); executor.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(5)).GetAwaiter().GetResult(); }
public void FuzzyScheduling(int producerCount, bool perCpu, int taskPerProducer) { int producerCountFinal = perCpu ? producerCount * Environment.ProcessorCount : producerCount; var valueContainer = new Container <int> { Value = taskPerProducer * producerCountFinal }; var mre = new ManualResetEvent(false); Action noop = () => { if (--valueContainer.Value <= 0) { Assert.Equal(0, valueContainer.Value); mre.Set(); } }; var scheduler = new DefaultEventExecutor(); // SingleThreadEventExecutor("test", TimeSpan.FromSeconds(1)); IEnumerable <Task <Task> > producers = Enumerable.Range(1, producerCountFinal).Select(x => Task.Factory.StartNew( async() => { var r = new Random((int)Stopwatch.GetTimestamp() ^ x); for (int i = 0; i < taskPerProducer; i++) { scheduler.Execute(noop); await Task.Delay(r.Next(10, 100)); } }, TaskCreationOptions.LongRunning)); Task.WhenAll(producers).Wait(); Assert.True(mre.WaitOne(TimeSpan.FromSeconds(5))); }
public async Task ScheduledTaskFiresOnTimeWhileBusy() { var scheduler = new DefaultEventExecutor(); var promise = new DefaultPromise(); Action selfQueueAction = null; selfQueueAction = () => { if (!promise.Task.IsCompleted) { scheduler.Execute(selfQueueAction); } }; scheduler.Execute(selfQueueAction); Task task = scheduler.ScheduleAsync(() => promise.Complete(), TimeSpan.FromMilliseconds(100)); await Task.WhenAny(task, Task.Delay(TimeSpan.FromSeconds(1))); Assert.True(task.IsCompleted); }