Có hai câu trả lời tốt đã có, nhưng để thêm tôi 0.02 ...
Nếu bạn đang nói về tốn hoạt động không đồng bộ, async
/await
tác phẩm xuất sắc cho cả I/O-bound và CPU- bị ràng buộc.
Tôi nghĩ rằng các tài liệu MSDN có một nghiêng nhẹ về phía sản xuất hoạt động không đồng bộ, trong trường hợp bạn muốn sử dụng TaskCompletionSource
(hoặc tương tự) cho I/O-bound và Task.Run
(hoặc tương tự) cho CPU-bound .Khi bạn đã tạo xong trình bao bọc Task
ban đầu, tốt nhất là đã tiêu thụ theo async
và await
.
Ví dụ cụ thể của bạn, nó thực sự đi xuống bao nhiêu thời gian LoadHtmlDocument
sẽ mất. Nếu bạn xóa Task.Run
, bạn sẽ thực hiện nó trong cùng một ngữ cảnh gọi LoadPage
(có thể trên chuỗi giao diện người dùng). Hướng dẫn của Windows 8 chỉ định rằng bất kỳ hoạt động nào lấy hơn 50ms phải được thực hiện async
... lưu ý rằng 50ms trên máy phát triển của bạn có thể dài hơn trên máy của khách hàng ...
Vì vậy, nếu bạn có thể đảm bảo rằng LoadHtmlDocument
sẽ chạy dưới 50ms, bạn chỉ có thể thực hiện trực tiếp:
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
}
Tuy nhiên, tôi muốn giới thiệu ConfigureAwait
như @svick đề cập:
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
}
với ConfigureAwait
, nếu t yêu cầu HTTP của anh ta không hoàn thành ngay lập tức (đồng bộ), sau đó điều này sẽ (trong trường hợp này) gây ra LoadHtmlDocument
để được thực hiện trên một luồng thread thread mà không có lệnh gọi rõ ràng tới Task.Run
.
Nếu bạn quan tâm đến hiệu suất async
ở cấp độ này, bạn nên kiểm tra số video và MSDN article của Stephen Toub về chủ đề này. Anh ta có rất nhiều thông tin hữu ích.