2016-07-11 37 views
5

Khi tôi xây dựng một thể hiện của một lớp mà tôi có, tôi muốn kích hoạt một chức năng đổi mới mã thông báo (async) và để cho nó chạy ở chế độ nền (tôi giữ một tham chiếu đến trả về Task).Điều gì sẽ xảy ra khi chờ nhiệm vụ đã hoàn thành?

Sau đó, khi người dùng kích hoạt yêu cầu, tôi muốn chờ đợi trên Task.

Giả sử rằng Task hoàn tất sau 1 giây và người dùng kích hoạt yêu cầu sau 2 giây (nghĩa là, Task hoàn tất).

Phương pháp xử lý yêu cầu của người dùng await s rằng Task, nó sẽ nhận được giá trị ngay lập tức? sau khi tất cả, các Task được hoàn thành và giữ giá trị.

+3

Có, nó sẽ ngay lập tức trả lại kết quả. –

+0

@MatthewWatson tại sao bạn không viết câu trả lời? Tôi đã chấp nhận câu trả lời của bạn. – johni

+0

Nó không đủ dài hoặc đủ chi tiết để viết như một câu trả lời, tôi nghĩ. –

Trả lời

6

Phương thức xử lý yêu cầu của người dùng đang chờ tác vụ đó, nó sẽ nhận được giá trị ngay lập tức?

Có. Bạn có thể nghĩ về nó như là lười biếng, nếu bạn await một nhiệm vụ đã được hoàn thành, nó sẽ trả về ngay lập tức. Bạn có thể chờ đợi nó nhiều lần trên các chủ đề khác nhau và nó sẽ chỉ trở lại khi nó có kết quả (hoặc bị lỗi).

Task.CompletedTask được thêm vào như một nguyên tắc cho chính lý do này. Bạn có thể await điều này và nó sẽ ngay lập tức trở lại một nhiệm vụ thành công vì nó đã được hoàn thành.

0

Bạn sẽ có được kết quả. Khi nhiệm vụ hoàn tất, thuộc tính kết quả của nó sẽ chứa kết quả và giữ nó.

1

Bạn có thể tạo một nhiệm vụ hoàn thành sử dụng Task.FromResult (giá trị) và chờ đợi nó:

var result = await Task.FromResult(5); 
Debug.Assert(result == 5); 

này rất hữu ích ví dụ nếu bạn có một phương pháp mà có thể trở lại cache dữ liệu nhưng cần phải lấy nó không đồng bộ các lần đầu tiên.

Vì vậy, có, bạn có thể chờ đợi các tác vụ đã hoàn thành.

Các vấn đề liên quan