Как заставить код после ожидаемого запуска на планировщике внутренней области? - PullRequest
0 голосов
/ 16 октября 2018

Я ожидал, что в отсутствие SynchronizationContext поток выполнения не изменит поток.Этот код показывает, что поток выполнения изменяет выполняемый поток, а код после await выполняется в потоке из ThreadPool.

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace Test
{
    public class Program
    {
        public static async Task Main()
        {
            var ts = new MyTaskScheduler();
            var t = Task.Factory.StartNew(() => Console.WriteLine($"Inside '{Thread.CurrentThread.Name}'"), CancellationToken.None, TaskCreationOptions.None, ts);
            await t;
            Console.WriteLine($"Outside '{Thread.CurrentThread.Name}'");
            Console.ReadLine();
        }
    }
    public class MyTaskScheduler : TaskScheduler
    {
        private readonly Thread thread;
        private readonly BlockingCollection<Task> queue;

        public MyTaskScheduler()
        {
            queue = new BlockingCollection<Task>();
            thread = new Thread(() => Loop()) { Name = "my thread" };
            thread.Start();
        }

        private void Loop()
        {
            while (true)
                foreach (var task in queue.GetConsumingEnumerable())
                    TryExecuteTask(task);
        }

        protected override void QueueTask(Task task) => queue.Add(task);
        protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) => TryExecuteTask(task);
        protected override IEnumerable<Task> GetScheduledTasks() => queue.ToList();
        public override int MaximumConcurrencyLevel => 1;
    }
}

screenshot

Я могу использовать TaskCreationOptions.HideScheduler, чтобы получить поведение, которое мне нужно.Но из его описания я не могу понять, является ли это рекомендуемым параметром в этом случае или побочным эффектом с неизвестными последствиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...