RunSynchronously
делегирует решение о том, когда начинать задачу, текущему планировщику задач (или переданному в качестве аргумента).
Я не уверен, почему он существует (возможно, для внутреннего или устаревшего использования).), но трудно представить себе полезный вариант использования в текущих версиях .NET . @ Фабьян имеет возможное объяснение в своем комментарии к вопросу.
RunSynchronously
просит планировщика запустить его синхронно, но тогда планировщик вполне может проигнорировать подсказку и запустить его впоток пула потоков, и ваш текущий поток будет синхронно блокироваться, пока он не будет завершен.
Планировщик не должен запускать его в текущем потоке и не должен запускать его немедленно, хотя я думаю, что это то, что произойдет наобщие планировщики (ThreadPoolTaskScheduler и общие планировщики пользовательского интерфейса).
RunSynchronously
также вызовет исключение, если задача уже запущена или завершена / неисправна (это означает, что вы не сможете использовать ее в асинхронных методах).
Этот код может прояснить другое поведение:
Wait
и Result
вообще не запускают задачу, они просто ждут завершения задачи в текущем потоке изаблокируйте его до завершения, поэтому, если мы хотим сравнить, мы можем сравнить Start
и Wait
с RunSynchronously
:
class Scheduler : TaskScheduler
{
protected override void QueueTask(Task task) =>
Console.WriteLine("QueueTask");
protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
Console.WriteLine("TryExecuteTaskInline");
return false;
}
protected override IEnumerable<Task> GetScheduledTasks() => throw new NotImplementedException();
}
static class Program
{
static void Main()
{
var taskToStart = new Task(() => { });
var taskToRunSynchronously = new Task(() => { });
taskToStart.Start(new Scheduler());
taskToRunSynchronously.RunSynchronously(new Scheduler());
}
}
IЕсли вы попытаетесь прокомментировать Start или RunSynchronously
и запустите код, вы увидите, что Start
попытается поставить задачу в очередь в планировщике, а RunSynchronously
попытается выполнить ее в строке и, если произойдет сбой (вернет false), будетпросто поставь в очередь.