Có một chuyển đổi ngầm xảy ra giữa Nhiệm vụ <> và int không?
Không. Đây chỉ là một phần của cách thức async/ awaitcông việc.
Bất kỳ phương thức nào được khai báo là asyncphải có kiểu trả về:
void (tránh nếu có thể)
Task (không có kết quả ngoài thông báo hoàn thành / thất bại)
Task<T>(cho kết quả hợp lý của loại Ttheo cách không đồng bộ)
Trình biên dịch thực hiện tất cả các gói thích hợp. Vấn đề là bạn quay trở lại không đồng bộurlContents.Length - bạn không thể làm cho phương thức trở lại int, vì phương thức thực tế sẽ trả về khi nó chạm vào awaitbiểu thức đầu tiên chưa hoàn thành. Vì vậy, thay vào đó, nó trả về một Task<int>cái sẽ hoàn thành khi chính phương thức async hoàn thành.
Lưu ý rằng awaitkhông điều ngược lại - nó unwraps một Task<T>đến một Tgiá trị, đó là cách dòng này hoạt động:
string urlContents = await getStringTask;
... nhưng tất nhiên nó sẽ hủy kết nối nó một cách không đồng bộ, trong khi chỉ cần sử dụng Resultsẽ chặn cho đến khi nhiệm vụ hoàn thành. ( awaitcó thể hủy bỏ các loại khác thực hiện mẫu đang chờ, nhưng Task<T>là loại bạn có thể sử dụng thường xuyên nhất.)
Gói / bỏ gói kép này là những gì cho phép async có thể kết hợp được. Ví dụ: tôi có thể viết một phương thức async khác gọi cho bạn và nhân đôi kết quả:
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(Hoặc đơn giản là return await AccessTheWebAsync() * 2;tất nhiên.)
asynctừ khóa.