Quando Task.ContinueWith deve ser chamado com TaskScheduler.Current como argumento?

Nós estamos usandoeste trecho de código do StackOverflow para produzir uma tarefa que é concluída assim que a primeira de uma coleção de tarefas é concluída com êxito. Devido à natureza não linear de sua execução,async/await não é realmente viável e, portanto, esse código usaContinueWith() em vez de. Porém, ele não especifica um TaskScheduler, que umnúmero do fontes mencionado pode ser perigoso porque usaTaskScheduler.Current quando a maioria dos desenvolvedores geralmente esperaTaskScheduler.Default comportamento de continuações.

A sabedoria predominante parece ser que você sempre deve passar um TaskScheduler explícito para ContinueWith. No entanto, não vi uma explicação clara de quando diferentes Agendadores de Tarefas seriam mais apropriados.

Qual é um exemplo específico de um caso em que seria melhor passarTaskScheduler.Current para dentroContinueWith(), em oposição aTaskScheduler.Default? Existem regras práticas a seguir ao tomar essa decisão?

Para o contexto, aqui está o trecho de código ao qual estou me referindo:

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;
}

questionAnswers(4)

yourAnswerToTheQuestion