Technicznie, że działa, ale działa poprzez utworzenie nowej nici do wykonywania synchronicznego operację, która sama jest zawijany i zablokowania z natury asynchronicznego pracy. Oznacza to, że nie uzyskujesz większych korzyści z przejścia na async
w pierwszej kolejności.
Właściwa droga to przejście asynchroniczne do końca. Natomiast teraz prawdopodobnie masz coś takiego:
private class UserService
{
public IdentityUser GetById(int id)
{
return mContext.Users.Single(u => u.Id == id);
}
}
... należy teraz utworzyć wersji asynchronicznej:
private class UserService
{
public async Task<IdentityUser> GetByIdAsync(int id)
{
return await mContext.Users.SingleAsync(u => u.Id == id);
}
}
Zastosowanie:
public async Task<IdentityUser> GetByIdAsync(int id)
{
return await _userService.GetByIdAsync(id);
}
zakładając, oczywiście, że Twoja podstawowa struktura obsługuje asynchroniczne metody, takie jak SingleAsync()
dla operacji z natury asynchronicznych, dzięki temu system może zwolnić bieżący wątek podczas oczekiwania na magistrale danych e operacja do ukończenia. Wątek można ponownie wykorzystać w innym miejscu, a po zakończeniu operacji można użyć dowolnej dostępnej nici w tym czasie.
Prawdopodobnie warto również przeczytać i przyjąć these Best Practices. Prawdopodobnie będziesz chciał użyć numeru .ConfigureAwait(false)
w dowolnym miejscu, w którym nie masz dostępu do informacji kontekstowych, takich jak sesje i żądania.
Ta odpowiedź zakłada oczywiście, że GetById
jest z natury asynchroniczny: pobierasz go z dysku twardego lub lokalizacji sieciowej lub coś podobnego. Jeśli oblicza się identyfikator użytkownika przy użyciu długotrwałej pracy procesora, to dobrym pomysłem jest przejście na Task.Run()
i prawdopodobnie będziesz chciał dodatkowo określić, że jest to długotrwałe zadanie w argumentach dla Task.Run()
.
Długotrwałe zapytania mają długą listę możliwych problemów, z którymi trzeba się uporać. Dlaczego po prostu nie zainstalujesz SignalR nuget i nie ustawisz ich dla siebie - i wsparcia dla websocket! –
@ MattiasÅslund: Różni ludzie mają różne definicje "długiego biegu". Mam wrażenie, że GetById() nie jest "długim bieganiem", który zasługuje na użycie SignalR. – StriplingWarrior
Czy jest to coś, co zużywasz jako usługa WCF lub Web API? Jeśli tak, to tylko pogorszysz sytuację po stronie serwera. – Noseratio