Sto leggendo il codice sorgente di estensioni interattive e hanno trovato un line che non riesco a capire:C# Compiti - Perché è necessario una linea noop in questo caso
public static Task<bool> UsingEnumerator(this Task<bool> task, IDisposable disposable)
{
task.ContinueWith(t =>
{
if (t.IsFaulted)
{
var ignored = t.Exception; // don't remove!
}
if (t.IsFaulted || t.IsCanceled || !t.Result)
disposable.Dispose();
}, TaskContinuationOptions.ExecuteSynchronously);
return task;
}
anche io non vedo alcuna osservazioni rilevanti in i documenti per le proprietà IsFaulted
o Exception
.
Perché questa riga var ignored = t.Exception; // don't remove!
è necessaria in questo contesto?
Una domanda correlata: ho pensato che tali linee sono ottimizzate nella modalità di rilascio, ma dato il commento e l'intento qui non è il caso (se il codice è corretto). Quindi perché questa linea rimane nella modalità di rilascio?
In .net 4 il finalizzatore di attività genera un'eccezione se un'attività è in errore ma non si accede alla proprietà 'Exception'. – Lee
@Lee grazie! Questo in realtà è scritto nei documenti per la proprietà 'Exception' ma non l'ho capito nella prima lettura. –
rispetto alla sua rimozione nei build di rilascio, il locale 'ignorato' verrà rimosso, ma' t.Exception' verrà risolto al suo valore (perché potrebbe, e in questo caso, causare effetti collaterali) è solo che il valore di ritorno viene rilasciato sul pavimento nelle build di rilascio invece di essere memorizzato in una variabile non letta. – Servy