5

Nel seguente codice "Internal catch block" non viene mai stampato. "La linea finale" è stampata però. Perchè così? Per favore aiuto.Perché Task.WaitAny non fa eccezione?

Task task1 = Task.Factory.StartNew(() => 
    {     
     throw new Exception("some exception");    
    }); 

    try 
    { 
     Task.WaitAny(new Task[] { task1 }); 
    } 
    catch(Exception e) 
    { 
     Console.WriteLine("Inside catch block."); 
    } 

    Console.WriteLine("Final line."); 
+1

@Servy, penso che la questione non è proprio la stessa della esistente. –

+0

@Servy: l'altra domanda era molto diversa. Puoi rimuovere quel marchio duplicato? Ho votato per riaprire questa domanda. – KFL

risposta

-1
 Task task1 = Task.Factory.StartNew(() => 
     { 
      throw new Exception("some exception"); 
     }) 
     .ContinueWith(task => Console.WriteLine(task.Exception.InnerException.Message), TaskContinuationOptions.OnlyOnFaulted); 

quindi non è che non è un'eccezione semplicemente non sta gettando l'eccezione sullo stesso thread come filo conduttore.

1

Questo perché il codice in esecuzione in un thread diverso, ma è possibile intercettare l'eccezione si è verificata in un thread diverso utilizzando il seguente codice

Task task1 = Task.Factory.StartNew(() => 
     { 
      throw new Exception("some exception"); 
     }); 

     try 
     { 
      task1.Wait(); 
     } 
     catch (AggregateException ex) 
     { 
      Console.WriteLine(ex); 
     } 
+4

Grazie Joseph per la tua risposta. Ma MSDN non documenta questo comportamento speciale del metodo WaitAny(). Se usiamo Wait() o WaitAll(), il blocco catch viene eseguito, ma non viene eseguito in caso di WaitAny(). Dubito che Microsoft intendesse davvero che WaitAny() sia in questo modo o che sia un bug. –