2013-03-13 55 views
6

Tôi cần thực thi nhiều tác vụ không đồng bộ trong Silverlight.Thực hiện các tác vụ song song với async/await

Tài liệu về các trạng thái gói bên thứ 3 tôi có thể sử dụng

await Task.WhenAll() 

Thật không may Silverlight chỉ có Task.WaitAll() và nó không phải là awaitable. Nếu tôi cố gắng sử dụng nó, tôi bị bế tắc (tôi giả sử - bởi vì toàn bộ điều bị đóng băng)

Mẫu thích hợp để sử dụng trong phương pháp async là gì?

+0

Đó phải là cách khác. Đó là 'WaitAll' cần được loại trừ khỏi API Silverlight và WhenAll nên được bao gồm. Bạn đã cài đặt đúng phiên bản .NET chưa? – Servy

+0

FWIW, trên stock SL5 của tôi, tôi chỉ thấy 'Task.WaitAll'; không có 'Task.WhenAll' tôi giả định trừ khi tôi cài đặt một số thư viện của bên thứ ba. –

Trả lời

10

Đối với Silverlight Tôi giả sử bạn đang sử dụng gói Microsoft.Bcl.Async.

Vì gói (tiện ích bổ sung) này không thể sửa đổi loại (được xây dựng sẵn) Task, bạn sẽ tìm thấy một số phương pháp hữu ích trong loại TaskEx. Bao gồm WhenAll:

await TaskEx.WhenAll(...); 
1

Tôi nghĩ rằng bạn có thể thử sử dụng TaskFactory.ContinueWhenAll để có hành vi tương tự nếu tôi hiểu câu hỏi của bạn một cách chính xác. Example:

var task1 = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(1000); 
    return "dummy value 1"; 
}); 

var task2 = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(2000); 
    return "dummy value 2"; 
}); 

var task3 = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(3000); 
    return "dummy value 3"; 
}); 

Task.Factory.ContinueWhenAll(new[] { task1, task2, task3 }, tasks => 
{ 
    foreach (Task<string> task in tasks) 
    { 
     Console.WriteLine(task.Result); 
    } 
}); 
Các vấn đề liên quan