コード例 #1
0
        public async Task SchedulingSimpleTest()
        {
            const int TasksCount = 5000;
            var       threadIds  = new HashSetEx <int>();
            var       priorities = new HashSetEx <ThreadPriority>();
            var       taskWasNotContinuedInline = false;
            var       tasks = new Task[TasksCount];
            var       rnd   = new Random(0);

            for (int i = 0; i < TasksCount; i++)
            {
                tasks[i] = HeavyComputationTaskScheduler.Run(
                    async() =>
                {
                    lock (threadIds)
                    {
                        threadIds.Add(Thread.CurrentThread.ManagedThreadId);
                        priorities.Add(Thread.CurrentThread.Priority);
                    }

                    Thread.SpinWait(100_000 * rnd.Next(3, 6));

                    await Task.Yield();

                    lock (threadIds)
                    {
                        threadIds.Add(Thread.CurrentThread.ManagedThreadId);
                        priorities.Add(Thread.CurrentThread.Priority);
                    }

                    await Task.Delay(1);

                    var tid = Thread.CurrentThread.ManagedThreadId;

                    await Task.CompletedTask;

                    if (tid != Thread.CurrentThread.ManagedThreadId)
                    {
                        taskWasNotContinuedInline = true;
                    }

                    lock (threadIds)
                    {
                        threadIds.Add(Thread.CurrentThread.ManagedThreadId);
                        priorities.Add(Thread.CurrentThread.Priority);
                    }

                    Thread.SpinWait(100_000 * rnd.Next(3, 6));
                });
            }

            await Task.WhenAll(tasks);

            //// threadIds.Count.Should().Be(Environment.ProcessorCount);
            priorities.Count.Should().Be(1);
            priorities.Single().Should().Be(ThreadPriority.BelowNormal);
            taskWasNotContinuedInline.Should().BeFalse();
        }