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
/ await
công việc.
Bất kỳ phương thức nào được khai báo là async
phả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 T
theo 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 await
biể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 await
không điều ngược lại - nó unwraps một Task<T>
đến một T
giá 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 Result
sẽ chặn cho đến khi nhiệm vụ hoàn thành. ( await
có 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.)
async
từ khóa.