예제 #1
0
        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();
        }
예제 #2
0
        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;
            }
        }
예제 #3
0
        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();
        }
예제 #4
0
        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();
        }
예제 #5
0
    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());
    }