Спасибо за ответ на вопрос. Это дает мне возможность продолжить.

пользуемэтот фрагмент кода из StackOverflow для создания Задачи, которая завершается, как только первая из набора задач завершается успешно. Из-за нелинейного характера его исполнения,async/await на самом деле не является жизнеспособным, и поэтому этот код используетContinueWith() вместо. Тем не менее, он не определяет TaskScheduler, которыйномер из источники упомянул может быть опасным, потому что он используетTaskScheduler.Current когда большинство разработчиков обычно ожидаютTaskScheduler.Default поведение из продолжений.

Похоже, что преобладающей мудростью является то, что вы всегда должны передавать явный TaskScheduler в ContinueWith. Однако я не видел четкого объяснения того, когда разные TaskSchedulers будут наиболее подходящими.

Каков конкретный пример случая, когда было бы лучше пройтиTaskScheduler.Current вContinueWith()в отличие отTaskScheduler.Default? Есть ли практические правила, которым нужно следовать при принятии этого решения?

Для контекста, вот фрагмент кода, на который я ссылаюсь:

public static Task<T> FirstSuccessfulTask<T>(IEnumerable<Task<T>> tasks)
{
    var taskList = tasks.ToList();
    var tcs = new TaskCompletionSource<T>();
    int remainingTasks = taskList.Count;
    foreach(var task in taskList)
    {
        task.ContinueWith(t =>
            if(task.Status == TaskStatus.RanToCompletion)
                tcs.TrySetResult(t.Result));
            else
                if(Interlocked.Decrement(ref remainingTasks) == 0)
                    tcs.SetException(new AggregateException(
                        tasks.SelectMany(t => t.Exception.InnerExceptions));
    }
    return tcs.Task;
}

Ответы на вопрос(4)

Ваш ответ на вопрос