Czy ktoś może wyjaśnić, co to oznacza dla metody synchronicznej? Jeśli spróbuję zmienić metodę na async
to VS narzekają na to.
To działa:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
To nie działa:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
Zasadniczo chciałbym wiedzieć, co to dokładnie oznacza: Task.FromResult<object>(null);
c#
asynchronous
async-await
David Dury
źródło
źródło
return;
działa ...!void
funkcji.Odpowiedzi:
async
metody różnią się od zwykłych metod. Cokolwiek zwracasz zasync
metod, jest opakowane w plikTask
.Jeśli nie zwrócisz żadnej wartości (void), zostanie ona zapakowana
Task
, jeśli zwróciszint
, zostanie zapakowanaTask<int>
i tak dalej.Jeśli twoja metoda asynchroniczna wymaga zwrócenia
int
, oznacz typ zwracania metody jako,Task<int>
a zwrócisz zwykły, aint
nieTask<int>
. Kompilator będzie przekonwertowaćint
doTask<int>
dla ciebie.Tak samo, kiedy zwracasz
Task<object>
zwracany typ metody powinien byćTask<Task<object>>
Ponieważ Twoja metoda zwraca
Task
, nie powinna zwracać żadnej wartości. W przeciwnym razie nie będzie się kompilować.Należy pamiętać, że metoda asynchroniczna bez
await
instrukcji nie jestasync
.źródło
DoStuff()
też czekać . Na przykład:var x = await DoStuff();
return await Task.FromResult<object>(null);
Task.WhenAny
jest @ProfK .Musisz użyć słowa kluczowego await, gdy używasz async, a typ zwracanej funkcji powinien być ogólny. Oto przykład ze zwracaną wartością:
Oto przykład bez zwracanej wartości:
Przeczytaj to:
TPL: http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx i Tasks: http://msdn.microsoft.com/en-us/library/system.threading .tasks (v = w porównaniu do 110) .aspx
Async: http://msdn.microsoft.com/en-us/library/hh156513.aspx Oczekiwanie: http://msdn.microsoft.com/en-us/library/hh156528.aspx
źródło
null
bezpośrednio, zamiast czekać na fikcyjne zadanie.async
metoda będzie wykonywana asynchronicznie z sugestią, aby użyćawait
słowa kluczowego gdzieś w metodzie. Proponuję po prostu użyćreturn Task.FromResult((object)null);
i usunąćasync
słowo kluczowe, aby zmniejszyć hałas ostrzegawczy kompilatora.return
w zadaniu, ale zadanie jest wykonywane, ponieważreturn
nie zwracaTask
Dodanie słowa kluczowego async to tylko cukier składniowy, który upraszcza tworzenie maszyny stanów. Zasadniczo kompilator pobiera Twój kod;
I zamienia to w;
Jeśli twój kod ma jakieś
await
słowa kluczowe, kompilator musi wziąć twoją metodę i przekształcić ją w klasę reprezentującą maszynę stanu wymaganą do jej wykonania. Przy każdymawait
słowie kluczowym stan zmiennych i stos zostaną zachowane w polach klasy, klasa doda się jako punkt zakończenia zadania, na które czekasz, a następnie wróci.Po zakończeniu tego zadania Twoje zadanie zostanie ponownie wykonane. Tak więc na początku metody jest dodawany dodatkowy kod, aby przywrócić stan zmiennych i przejść do następnej części kodu.
Zobacz, co generuje async i await? na przykład krwawy.
Ten proces ma wiele wspólnego ze sposobem, w jaki kompilator obsługuje metody iteratora z instrukcjami yield.
źródło
To jest zadanie, które zwraca zadanie typu String (funkcja anonimowa C # lub innymi słowy jest używana delegacja „Func”)
źródło
Aby uzyskać prawidłowe odpowiedzi z metod asynchronicznych, należy ustawić await podczas wywoływania tych metod zadań. To będzie czekać na przekonwertowanie go z powrotem na zwracany typ wartości, a nie na typ zadania.
źródło