Что такое планировщик задач?
SynchronizationContext — это общая абстракция для «планировщика». Отдельные фреймворки иногда имеют свои собственные абстракции для планировщика, и System.Threading.Tasks это не исключение. Когда Tasks поддерживаются делегатом, поэтому их можно поставить в очередь и выполнить, они связаны с файлом System.Threading.Tasks.TaskScheduler. Точно так же, как SynchronizationContext предоставляет виртуальный Post метод для постановки в очередь вызова делегата (с последующим вызовом делегата с помощью типичных механизмов вызова делегата), TaskScheduler он предоставляет абстрактный QueueTaskметод (с последующим вызовом реализации Taskс помощью ExecuteTask метода).
Планировщик по умолчанию, возвращаемый функцией, TaskScheduler.Default представляет собой пул потоков, но из него можно получить TaskScheduler и переопределить соответствующие методы для достижения произвольного поведения в зависимости от того, когда и где Task вызывается. Например, основные библиотеки включают System.Threading.Tasks.ConcurrentExclusiveSchedulerPair тип. Экземпляр этого класса предоставляет два TaskScheduler свойства: одно вызывается ExclusiveScheduler, а другое называется ConcurrentScheduler. Задачи, запланированные для ConcurrentScheduler могут выполняться одновременно, но с учетом ограничения, установленного ConcurrentExclusiveSchedulerPair при их создании (аналогично MaxConcurrencySynchronizationContext показанному ранее), и ни один ConcurrentScheduler Tasks не будет запускаться, когда выполняется запланированная Task , и одновременно разрешено запускать только одно эксклюзивное задание... таким образом, он ведет себя очень похоже на блокировку чтения/записи. ExclusiveSchedulerTask
Как SynchronizationContext также TaskScheduler имеет Current свойство, возвращающее «текущий» TaskScheduler. Однако, в отличие от SynchronizationContext, здесь нет способа установить текущий планировщик. Вместо этого текущий планировщик — это тот, который связан с запущенным в данный момент Task файлом . Планировщик предоставляется системе как часть запуска файла Task. Так, например, эта программа выведет «True», поскольку лямбда, используемая с, StartNew выполняется в ConcurrentExclusiveSchedulerPair's ExclusiveScheduler и увидит TaskScheduler.Current установленный для этого планировщика:
Интересно, что TaskScheduler предоставляет статический FromCurrentSynchronizationContext метод, который создает новый TaskScheduler объект, который Task ставит в очередь выполнение всех SynchronizationContext.Current возвращаемых значений, используя этот Post метод для задач постановки в очередь.
to be continued...