2013-01-07 19 views
5

Tôi muốn thực hiện một awaitable mảng bằng cách thực hiện một phương pháp khuyến nôngđang chờ mảng; bằng cách thực hiện phương pháp mở rộng cho mảng

public static IAwaitable GetAwaiter(this mytype[] t) 
{ 
    return t.First().GetAwaiter(); 
} 

nhưng mặc dù IntelliSense nói "(awaitable) mytype[]", trình biên dịch mang lại cho tôi một lỗi khi sử dụng

mytype[] t = new mytype[] { new mytype(), new mytype() }; 
await t; 

Cuộc gọi chờ đợi trên một đối tượng duy nhất của mytype hoạt động tốt. Tại sao vậy? Tôi có làm điều gì sai? Cảm ơn bạn đã giúp đỡ.

+0

đang chờ được sử dụng trên các cuộc gọi không đồng bộ, tại sao bạn sử dụng nó với các loại? – prthrokz

+1

Bạn đang gặp phải lỗi gì? –

+1

BTW: Sử dụng ['TaskCompletionSource '] (http://msdn.microsoft.com/en-us/library/dd449174.aspx) có vẻ tốt hơn là triển khai một lớp học đang chờ bạn: http://stackoverflow.com/ Câu hỏi/6731815/asyncctp-create-a-class-that-is-iawaitable –

Trả lời

3

Tôi nghĩ đây là lỗi trong trình biên dịch và bạn nên report it.

tôi có thể xác minh rằng mã này không hoạt động (sử dụng TaskTaskAwaiter, không loại tùy chỉnh):

public static TaskAwaiter GetAwaiter(this Task[] tasks) 
{ 
    return tasks.First().GetAwaiter(); 
} 

Task[] tasks = …; 
await tasks; 

(Nó tạo ra các lỗi "Không thể chờ đợi 'System.Threading.Tasks.Task [] '", theo báo cáo)

Nhưng trao đổi mảng cho IEnumerable (ở cả phương pháp và địa phương) làm việc:.

public static TaskAwaiter GetAwaiter(this IEnumerable<Task> tasks) 
{ 
    return tasks.First().GetAwaiter(); 
} 

IEnumerable<Task> tasks = …; 
await tasks; 

interes tingly, với phiên bản cố định, chờ đợi một mảng trực tiếp vẫn không hoạt động. Nhưng ví dụ như đang chờ IList thì không hoạt động.

+0

Tôi đã làm theo lời khuyên của bạn và báo cáo nó (xem https://connect.microsoft.com/VisualStudio/feedback/details/775990/await-array-by-implementing-extension-method-for-array-does-not-compile) . Cảm ơn vì nỗ lực điều tra của bạn. – David

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