Mam dwie asynchroniczne metody Task<int> DoInt()
i Task<string> DoString(int value)
. Mam trzecią metodę asynchroniczną Task<string> DoBoth(int value)
, której celem jest asynchroniczne wykonanie DoInt()
, wyprowadzenie jej wyniku do DoString(int)
, a wynikiem jest wynik DoBoth()
.Kontynuowanie zadania do zadania bez blokowania wyniku. Wynik
Istotne ograniczenia są:
- może nie mam kodu źródłowego do
DoInt()
lubDoString()
, więc nie można je modyfikować. - Nie chcę, aby zablokować w dowolnym momencie
- Wyjście (wynik) z jednego zadania muszą być przekazywane jako wejście do następnego
- Wyjście końcowego (wynik) jest to, co chcę być wynikiem
DoBoth()
Kluczem jest to, że mam już metody asynchroniczne (tj. Zadanie powrotu) i chcę przesyłać dane od zadania do zadania, bez blokowania po drodze, zwracając wynik końcowy w zadaniu początkowym. Mogę zrobić wszystkie poniższe wyjątkiem nie blokując w poniższym kodzie:
przykładKod:
// Two asynchronous methods from another library, i.e. can't be changed
Task<int> DoInt();
Task<string> DoString(int value);
Task<string> DoBoth()
{
return DoInt().ContinueWith<string>(intTask =>
{
// Don't want to block here on DoString().Result
return DoString(intTask.Result).Result;
});
}
Od Task<string> DoString(int)
jest już sposób asynchroniczny, w jaki sposób czysto stworzyć nieblokującą kontynuację do niego? Skutecznie chcę utworzyć kontynuację z istniejącego zadania, a nie z func.
Czy 'DoInt' przyjmuje int jako argument, czy nie? Masz to na dwa sposoby w swoim poście ... –
@ReedCopsey - Poprawiłem podpis dla DoInt(). To, czy ma on parametr, czy nie, nie jest ważne w tym przykładzie, ale niekonsekwencja w moim przykładzie jest myląca :) Zmieniono także nazwę valueTask => intTask dla jasności. – MikeJansen