Diferente manejo de excepciones entre Task.Run y ​​Task.Factory.StartNew

Me encontré con un problema cuando estaba usandoTask.Factory.StartNew y trató de capturar unaexception que se tira En mi aplicación tengo una tarea de larga ejecución que quiero encapsular en unTask.Factory.StartNew(.., TaskCreationOptions.LongRunning);

Sin embargo, la excepción no se detecta cuando estoy usandoTask.Factory.StartNew. Sin embargo está funcionando como espero cuando lo uso.Task.Run, que pensé que era sólo un envoltorio enTask.Factory.StartNew (según por ejemploeste artículo de MSDN).

Aquí se proporciona un ejemplo de trabajo, la diferencia es que la excepción se escribe en la consola cuando se usaTask.Run, pero no cuando se usaFactory.StartNew.

Mi pregunta sería:
si tengo unLongRunning Tarea que tiene la posibilidad de lanzar excepciones, ¿cómo debo manejarlas en el código de llamada?

private static void Main(string[] args)
{
    Task<bool> t = RunLongTask();
    t.Wait();
    Console.WriteLine(t.Result);
    Console.ReadKey();
}

private async static Task<bool> RunLongTask()
{
    try
    {
        await RunTaskAsync();
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        return false;
    }
    Console.WriteLine("success");
    return true;
}

private static Task RunTaskAsync()
{
    //return Task.Run(async () =>
    //    {
    //        throw new Exception("my exception");
    //    });
    return Task.Factory.StartNew(
        async () =>
    {
        throw new Exception("my exception");
    });

}

Respuestas a la pregunta(3)

Su respuesta a la pregunta