istnieją już dwie dobre odpowiedzi, ale dodać moje 0.02 ...
Jeśli mówisz spożywania asynchronicznych operacji, async
/await
prace doskonale zarówno dla I/O-związany i czynności znacznie obciążające procesor granica.
myślę docs MSDN mają niewielki skos ku produkującej asynchronicznych operacji, w tym przypadku użytkownik chce używać TaskCompletionSource
(lub podobny) na I/O-związany i Task.Run
(lub podobny) dla CPU-bound .Po utworzeniu początkowego opakowania Task
najlepiej jest go przetworzyć pod warunkiem przez async
i await
.
Dla konkretnego przykładu, to naprawdę sprowadza się do tego, ile czasu zajmie LoadHtmlDocument
. Jeśli usuniesz Task.Run
, wykonasz go w tym samym kontekście, który wywołuje LoadPage
(prawdopodobnie w wątku UI). Windows 8 Wytyczne określają, że wszelkie czynności mające więcej niż 50ms należy async
... pamiętając, że 50ms na komputerze deweloperskim mogą być już na komputerze klienta ...
więc jeśli można zagwarantować, że będzie LoadHtmlDocument
trwać mniej niż 50ms, wystarczy wykonać go bezpośrednio:
public async Task<HtmlDocument> LoadPage(Uri address)
{
using (var httpResponse = await new HttpClient().GetAsync(address)) //IO-bound
using (var responseContent = httpResponse.Content)
using (var contentStream = await responseContent.ReadAsStreamAsync()) //IO-bound
return LoadHtmlDocument(contentStream); //CPU-bound
}
jednak polecam ConfigureAwait
jak @svick wymienić:
public async Task<HtmlDocument> LoadPage(Uri address)
{
using (var httpResponse = await new HttpClient().GetAsync(address)
.ConfigureAwait(continueOnCapturedContext: false)) //IO-bound
using (var responseContent = httpResponse.Content)
using (var contentStream = await responseContent.ReadAsStreamAsync()
.ConfigureAwait(continueOnCapturedContext: false)) //IO-bound
return LoadHtmlDocument(contentStream); //CPU-bound
}
z ConfigureAwait
, jeśli t Żądanie HTTP nie kończy się natychmiast (synchronicznie), wówczas spowoduje to (w tym przypadku) wykonanie LoadHtmlDocument
w wątku puli wątków bez wyraźnego wywołania Task.Run
.
Jeśli interesuje Cię wydajność async
na tym poziomie, zapoznaj się z video Stephena Touba i MSDN article na ten temat. Ma mnóstwo przydatnych informacji.