Domanda

Sto guardando la movimentazione esempio da MSDN eccezione TPL @

http://msdn.microsoft. com / it-it / library / dd537614 (v = VS.100) aspx

La forma di base del codice è:

Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); });
try
{
   task1.Wait();
}
catch (AggregateException ae)
{
   throw ae.Flatten();
}

La mia domanda è: Si tratta di una condizione di competizione? Cosa succede se task1 getta prima che la prova ha eseguito? Mi sto perdendo qualcosa che si ferma essendo questa una gara?

Non dovrebbe essere scritto come questo, invece:

try
{
   Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); });
   task1.Wait();
}
catch (AggregateException ae)
{
   throw ae.Flatten();
}
È stato utile?

Soluzione

No, il primo esempio è perfettamente valido.

Quando l'eccezione è sollevata in Task è avvolto in un AggregateException. Solo quando un altro thread si unisce il compito, in questo esempio chiamando task1.Wait () è l'eccezione propogated al filo che unisce. Essenzialmente l'eccezione viene 'memorizzato' finché può essere propogated nuovo ad un processo in attesa per il feedback.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top