2012-09-14 5 views
5

La mia classe ha un metodo che produce un oggetto Task<int> utilizzando un TaskCompletionSource<int>. Quindi esegue alcune operazioni asincrone e imposta il risultato. Ho bisogno di sapere se posso fidarmi metodo del task ContinueWith o no:Come annullare la continuazione di un'attività?

public Task<int> CalculateAsync() 
{ 
    var source = new TaskCompletionSource(); 
    DoSomeAsyncStuffAndSetResultOf(source); 

    source.Task.ContinueWith(t => Console.WriteLine("Is this reliable?")); 
    return source.Task; 
} 

Può il chiamante del metodo CalculateAsync fare qualcosa con il compito prodotto e impedire la sua prosecuzione da corsa?

risposta

4

È possibile passare un CancellationToken a vari sovraccarichi di ContinueWith ... che sarebbe il modo più idiomatico di annullare la continuazione, IMO.

Non penso ci sia nulla che tu possa fare all'attività genitore per annullare le continuazioni. Spero di no, comunque ...

MODIFICA: Ok, sembra che tu stia cercando non lasciare che ciò accada. No, non devi preoccuparti. A meno che il chiamante non riesca in qualche modo a far funzionare il compito per sempre senza mai completarlo, annullato o in errore, la continuazione verrà eseguita.

+0

Oh, capisco - no, la continuazione verrà sempre eseguita (supponendo che il chiamante non possa forzare l'attività semplicemente in esecuzione per sempre, senza mai completare). –

+0

Eliminato il commento dopo aver visto la tua modifica. Cosa succede se chiama Dispose prima di impostare il risultato dell'attività? –

+1

@ ŞafakGür: Come per i documenti per Task.Dispose, questo genererà un'eccezione InvalidOperationException. –