Zunächst funktioniert Start()
nur an den (sehr seltenen) Task
s, die mit dem Task
Konstruktor erstellt wurden (zB new Task(() => _mq.Send(message))
). In allen anderen Fällen wird eine Ausnahme ausgelöst, weil Task
bereits gestartet ist oder auf einen anderen Task
wartet.
Nun, wahrscheinlich der beste Weg, dies zu tun wäre, um den Code in eine separate async
Methode zu setzen und verwenden await
:
async Task SendWithDelay(Message message)
{
await Task.Delay(1000);
_mq.Send(message);
}
Wenn Sie dies tun, eine Ausnahme von der Send()
Methode wird am Ende in die zurückgegebenen Task
.
Wenn Sie das nicht möchten, ist die Verwendung von ContinueWith()
ein sinnvoller Ansatz. In diesem Fall wäre die Ausnahme Task
von ContinueWith()
zurückgegeben.
Verwenden Sie je nach Typ _mq
auch SendAsync()
, wenn so etwas verfügbar ist.
Warum verwenden Sie das asynchrone CTP? Die endgültige Veröffentlichung ist schon lange nicht mehr möglich. Und wenn Sie eine asynchrone Methode verwenden können, müssen Sie ContinueWith nicht manuell verwenden - warten Sie nur auf die Verzögerung.Könnten Sie bitte mehr Kontext geben? –
Ja, es ist der beste Weg. für die Ausnahmebehandlung: http://stackoverflow.com/questions/12980712/what-is-the-best-way-to-catch-exception-in-task http://stackoverflow.com/questions/5983779/catch-exception-that-is-in-different-thread geworfen – Nahum
@jon: falsches tag :) es wird in einem Windows-Dienst verwendet. – David