Ich versuche, meinen Kopf rund um die TPL, die neuen async
/await
Funktionen in C# 5 und die Geheimnisse von TaskCompletionSource
.TaskCompletionSource: Wann SetResult() im Vergleich zu TrySetResult(), etc.
Eine Sache, die mir nicht klar ist, ist, wenn SetResult
zu verwenden, SetException
und SetCancel
gegen TrySetResult
, TrySetException
und TrySetCancel
.
Dies ist, was MSDN zu sagen hat:
Dieser Vorgang falsch zurück, wenn die Aufgabe ist bereits in einer der drei Endzustände: RanToCompletion, Faulted oder Abgebrochen.
Diese Methode gibt auch false zurück, wenn der zugrunde liegende Task bereits entsorgt wurde.
Ok, ich verstehe das, aber es gibt keine Anleitung darüber, wann oder warum man das eine über das andere verwendet.
Also, was ist das Geschäft?
d. H. Wirklich, der einzige Grund, warum Sie 'TrySetResult' aufrufen müssen, ist, wenn Sie das Ergebnis mehr als einmal einstellen. 'SetResult'" schließt "die zugehörige' Task' ab, so dass '' SetResult' 'erneut aufgerufen wird, um das 'Task''s Ergebnis zu setzen, nachdem die Task abgeschlossen ist. ('SetResult' blockiert bis zum' Task' - wie auch 'TrySetResult') Wenn Sie' SetResult' nur einmal aufrufen, sollten Sie niemals 'TrySetResult' benötigen. FWIW. 'SetResult' Ketten zu' TrySetResult' ... –
Danke Jungs, Sie machen eine Menge Sinn! – HolySamosa
Beachten Sie auch, dass SetResult 'void' zurückgibt, während TrySetResult' bool' zurückgibt. Wenn Sie also abhängig vom Task-Status etwas tun möchten, wird 'TrySetResult' gleichzeitig überprüft und gesetzt (atomar?). – chakrit