W języku C # i TPL ( biblioteka zadań równoległych ) Task
klasa reprezentuje trwającą pracę, która generuje wartość typu T.
Chciałbym wiedzieć, jaka jest potrzeba metody Task.FromResult ?
To znaczy: w scenariuszu, w którym masz już pod ręką wytworzoną wartość, jaka jest potrzeba zawinięcia jej z powrotem w Zadanie?
Jedyne, co przychodzi na myśl, to to, że jest używany jako adapter dla innych metod akceptujących instancję Task.
c#
.net
task-parallel-library
task
async-await
kwas lizergowy
źródło
źródło
Odpowiedzi:
Znalazłem dwa typowe przypadki użycia:
źródło
Task.FromResult
i klienta, który czeka asynchronicznie na sieciowe operacje we / wy. W ten sposób możesz współdzielić ten sam interfejs między klientem / serweremChannelFactory
.IEnumerable<T>
czerpania zIDisposable
- pozwala enumerable na dysponowanie zasobami jednorazowymi, a nie zmuszanie go do tego. AniFromResult
,async
ani nieawait
będzie tarło wątki.Task
metoda powrotu oznacza „ może być asynchroniczna”. Dlatego czasami metody otrzymują sygnaturę asynchroniczną, wiedząc doskonale, że niektóre implementacje będą synchroniczne (np.NetworkStream
Powinny być asynchroniczne, aleMemoryStream
powinny być synchronizowane).Jednym z przykładów może być metoda wykorzystująca pamięć podręczną. Jeśli wynik jest już obliczony, możesz zwrócić ukończone zadanie z wartością (używając
Task.FromResult
). Jeśli nie, to idź dalej i zwróć zadanie reprezentujące bieżącą pracę.Przykład pamięci podręcznej: Przykład pamięci podręcznej przy użyciu Task.FromResult dla wstępnie obliczonych wartości
źródło
Task.FromResult
, mogą być buforowane.Task.FromResult(0)
,Task.FromResult(1)
,Task.FromResult(false)
iTask.FromResult(true)
są buforowane. Nie należy buforować zadania dostępu do sieci, ale jedno z wyników jest całkowicie w porządku. Czy wolisz utworzyć taki za każdym razem, gdy musisz zwrócić wartość?Użyj go, jeśli chcesz utworzyć oczekiwaną metodę bez użycia słowa kluczowego async. Znalazłem ten przykład:
Tutaj tworzysz własną implementację interfejsu IHttpActionResult do użycia w akcji Web Api. Metoda ExecuteAsync powinna być asynchroniczna, ale nie trzeba używać słowa kluczowego async, aby uczynić ją asynchroniczną i wymaganą. Ponieważ masz już wynik i nie musisz na nic czekać, lepiej użyć Task.FromResult.
źródło
Z MSDN:
http://msdn.microsoft.com/en-us/library/hh228607.aspx
źródło
Użyj Task.FromResult, jeśli chcesz wykonać operację asynchroniczną, ale czasami wynik jest synchroniczny. Dobrą próbkę można znaleźć tutaj http://msdn.microsoft.com/en-us/library/hh228607.aspx .
źródło
Task.FromResult
służy do uzyskania wcześniej zapisanego wyniku asynchronicznego w pamięci podręcznej.Argumentowałbym, że możesz użyć Task.FromResult do metod synchronicznych, których wykonanie zajmuje dużo czasu, a Ty możesz wykonać inną niezależną pracę w swoim kodzie. Zamiast tego raczej używam tych metod do wywoływania asynchronizacji. Ale wyobraź sobie sytuację, w której nie masz kontroli nad wywoływanym kodem i potrzebujesz tego niejawnego przetwarzania równoległego.
źródło