¿Cuándo se debe llamar a Task.ContinueWith con TaskScheduler.Current como argumento?

Estamos usandoeste fragmento de código desde StackOverflow para producir una Tarea que se complete tan pronto como la primera de una colección de tareas se complete con éxito. Debido a la naturaleza no lineal de su ejecución,async/await no es realmente viable, por lo que este código usaContinueWith() en su lugar. Sin embargo, no especifica un TaskScheduler, que unnúmer d fuente han mencionado que puede ser peligroso porque usaTaskScheduler.Current cuando la mayoría de los desarrolladores suelen esperarTaskScheduler.Default comportamiento de las continuaciones.

La sabiduría predominante parece ser que siempre debe pasar un TaskScheduler explícito a ContinueWith. Sin embargo, no he visto una explicación clara de cuándo diferentes TaskSchedulers serían más apropiados.

¿Cuál es un ejemplo específico de un caso en el que sería mejor pasarTaskScheduler.Current dentroContinueWith(), Opuesto aTaskScheduler.Default? ¿Hay reglas generales a seguir al tomar esta decisión?

Para el contexto, aquí está el fragmento de código al que me refiero:

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

Respuestas a la pregunta(4)

Su respuesta a la pregunta