Prima di tutto, Start()
funziona solo sugli (molto rari) Task
s creati con il costruttore Task
(ad esempio new Task(() => _mq.Send(message))
). In tutti gli altri casi, verrà generata un'eccezione, poiché Task
è già stato avviato o in attesa di un altro Task
.
Ora, probabilmente il modo migliore per farlo sarebbe quello di mettere il codice in un metodo separato async
e utilizzare await
:
async Task SendWithDelay(Message message)
{
await Task.Delay(1000);
_mq.Send(message);
}
Se fate questo, ogni eccezione dal metodo Send()
finirà in il reso Task
.
Se non si desidera farlo, utilizzare ContinueWith()
è un approccio ragionevole. In tal caso, l'eccezione sarebbe nel Task
restituita da ContinueWith()
.
Inoltre, a seconda del tipo di _mq
, considerare l'utilizzo di SendAsync()
, se è disponibile qualcosa di simile.
Perché stai utilizzando il CTP asincrono? La versione finale è stata fuori per molto tempo. E se puoi usare un metodo asincrono, non devi usare ContinueWith manualmente - attendi il ritardo.Potresti dare più contesto per favore? –
sì, è il modo migliore. per la gestione delle eccezioni: http://stackoverflow.com/questions/12980712/what-is-the-best-way-to-catch-exception-in-task http://stackoverflow.com/questions/5983779/catch-exception-that-is-thrown-in-different-thread – Nahum
@jon: tag errato :) viene utilizzato all'interno di un servizio Windows. – David