Bạn nói đúng rằng năng suất và chờ đợi có liên quan chặt chẽ. Cả hai đều là điểm trong một luồng công việc mà phương thức hiện tại bị tạm dừng, điều khiển được trả về cho người gọi và phương thức tiếp tục tại một điểm không xác định trong tương lai tại điểm mà sản lượng/chờ đợi xảy ra.
Nhưng chúng rất khác nhau về hành động của chúng trên các toán hạng của chúng. Trên thực tế, chúng thực tế là duals của nhau. Lợi nhuận cung cấp một giá trị mới khi yêu cầu bằng mã lặp lại chuỗi. An await chiết xuất một giá trị khi nó là sản xuất bởi nhiệm vụ thực hiện không đồng bộ.
Null là giá trị hoàn toàn hợp lệ, do đó, điều này có ý nghĩa cho một sản lượng để thu hút nó đến người gọi của nó. Nhưng null không phải là tác vụ hợp lệ và do đó, không có ý nghĩa gì khi chờ tìm cách trích xuất giá trị từ tác vụ.
Hiện tại trong Unity3d bạn có thể trả về null; bên trong một coroutine để đại diện cho "Chờ cho khung tiếp theo".
Trong luồng công việc không đồng bộ đang chờ đợi, tương tự của yield return null;
chỉ là return null;
. Điều đó có nghĩa là "kết thúc phần này của luồng công việc không đồng bộ bằng cách cung cấp tham chiếu null". Tại sao bạn không đơn giản trả về null nếu bạn có ý định tạo ra một tác vụ có kết quả là null?
Hãy để tôi đặt một cách khác có thể rõ ràng hơn.Rõ ràng điều này làm cho không có ý nghĩa:
foreach(var x in null)
Console.WriteLine(x);
Đây là hệt vô nghĩa:
var x = await null;
Console.WriteLine(x);
Đây là những điều tương tự một cách logic. Foreach có nghĩa là "trích xuất một giá trị từ chuỗi miễn là giá trị có sẵn", nhưng null không phải là một chuỗi. Tương tự, "chờ đợi" có nghĩa là "trích xuất một giá trị từ tác vụ ngay sau khi một giá trị có sẵn", nhưng null không phải là một nhiệm vụ.
Đó là chìa khóa: tương tự không đồng bộ của await
không phải là yield return
, là foreach
. Đó là cơ chế chiết xuất số T
từ số IEnumerable<T>
hoặc Task<T>
. Thứ đặt T
vào loại monadic là yield return
cho IEnumerable<T>
và return
cho Task<T>
.
Nguồn
2017-01-04 01:15:34
Sẽ không chỉ là 'đang chờ Task.Yield() '? – spender
@spender Có, toàn bộ phương thức mở rộng sẽ là 'public static YieldAwaitable GetAwaiter (this ???? temp) {return Task.Yield(); } 'Tôi chỉ không biết nếu có một cái gì đó có thể với phần' ???? '. –
[Ẩn nghĩa đen không có loại] (https://ericlippert.com/2013/07/25/what-is-the-type-of-the-null-literal/) theo thông số kỹ thuật (kể từ 3.0), vì vậy tôi không nghĩ rằng có thể có bất cứ nơi nào để xác định một phương pháp mở rộng. – Blorgbeard