Powiedzmy mam dwóch samodzielnych funkcji async (że nie kontrolować), które tworzą obiekty zadanie:Jak łańcuch niezależnych zadań C#?
Task A();
Task B();
i jakąś inną funkcję niż asynchronicznej
void X();
Jak skonstruować jeden Łańcuch zadań, który wykonuje wszystkie te sekwencje i pozwala na dołączenie dalszych ciągów (które będą wykonywane po X)?
Gdybym to zrobić:
Task Sequential()
{
return A()
.ContinueWith(t => { B(); })
.ContinueWith(t => { X(); });
}
że nie działa, ponieważ B rozpocznie nowy łańcuch zadań. Jeśli B zajmie dużo czasu, X zostanie wykonane jako pierwsze (wraz z tym, co jeszcze wywołujący sekwenser może kontynuować w zwróconym zadaniu). Potrzebuję X jako ostatniego elementu w pojedynczym łańcuchu zadań, z zadaniem B jako jego precedensem.
Gdybym to zrobić.
Task Sequential()
{
return A()
.ContinueWith(t => { B().ContinueWith(t => { X(); }); });
}
że tylko częściowo rozwiązuje problem, bo choć A, B i X będzie teraz wykonać w kolejności, jeśli rozmówca robi kolejny() ContinueWith, że kontynuacja będzie wykonywany równolegle z B i X, a nie po X.
odpowiedź Alex jest droga, co chcesz iść. Ale dla twoich celów to, co próbujesz osiągnąć, wymagałoby użycia obietnicy (która służy do 'TaskCompletionSource'). –
Czy nie jest 'Task.WaitAll (A(), B()). ContinueWith (t => X())' opcja, jeśli powiesz, że 'A' i' B' są niezależne? – VMAtm
@VMAtm, masz na myśli 'Task.WhenAll'. –