public void WaitWithoutInlining_DoesNotWaitForOtherInlinedContinuations() { var sluggishScheduler = new SluggishInliningTaskScheduler(); var task = Task.Factory.StartNew( delegate { }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); var continuationUnblocked = new ManualResetEventSlim(); var continuationTask = task.ContinueWith( delegate { continuationUnblocked.Wait(); }, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, sluggishScheduler); // ensures the continuation never runs unless inlined task.WaitWithoutInlining(); continuationUnblocked.Set(); continuationTask.Wait(); }
public void WaitWithoutInlining_DoesNotWaitForOtherInlinedContinuations() { while (true) { var sluggishScheduler = new SluggishInliningTaskScheduler(); var task = Task.Delay(200); // This must not complete before we call WaitWithoutInlining. var continuationUnblocked = new ManualResetEventSlim(); var continuationTask = task.ContinueWith( delegate { Assert.True(continuationUnblocked.Wait(UnexpectedTimeout)); }, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, sluggishScheduler); // ensures the continuation never runs unless inlined if (continuationTask.IsCompleted) { // Evidently our Delay task completed too soon (and our continuationTask likely faulted due to timeout). // Start over. continue; } task.WaitWithoutInlining(); continuationUnblocked.Set(); continuationTask.GetAwaiter().GetResult(); break; } }
public void WaitWithoutInlining_DoesNotWaitForOtherInlinedContinuations() { var sluggishScheduler = new SluggishInliningTaskScheduler(); var task = Task.Delay(200); // This must not complete before we call WaitWithoutInlining. var continuationUnblocked = new ManualResetEventSlim(); var continuationTask = task.ContinueWith( delegate { Assert.True(continuationUnblocked.Wait(UnexpectedTimeout)); }, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, sluggishScheduler); // ensures the continuation never runs unless inlined task.WaitWithoutInlining(); continuationUnblocked.Set(); continuationTask.GetAwaiter().GetResult(); }
public void WaitWithoutInlining() { var sluggishScheduler = new SluggishInliningTaskScheduler(); var originalThread = Thread.CurrentThread; var task = Task.Factory.StartNew( delegate { Assert.NotSame(originalThread, Thread.CurrentThread); }, CancellationToken.None, TaskCreationOptions.None, sluggishScheduler); // Schedule the task such that we'll be very likely to call WaitWithoutInlining // *before* the task is scheduled to run on its own. sluggishScheduler.ScheduleTasksLater(); task.WaitWithoutInlining(); }
public void GetResultWithoutInlining() { var sluggishScheduler = new SluggishInliningTaskScheduler(); Thread? originalThread = Thread.CurrentThread; Task <int>?task = Task <int> .Factory.StartNew( delegate { Assert.NotSame(originalThread, Thread.CurrentThread); return(3); }, CancellationToken.None, TaskCreationOptions.None, sluggishScheduler); // Schedule the task such that we'll be very likely to call GetResultWithoutInlining // *before* the task is scheduled to run on its own. sluggishScheduler.ScheduleTasksLater(); Assert.Equal(3, task.GetResultWithoutInlining()); }