2014-11-10 18 views
6

Hy vọng rằng giá trị này sẽ khá đơn giản ở đây. Tôi có một bộ sưu tập các đối tượng, mỗi đối tượng có một phương thức async mà tôi muốn gọi và thu thập các giá trị từ đó. Tôi muốn họ chạy song song. Những gì tôi muốn đạt được có thể tóm tắt trong một dòng mã bị hỏng:Nhận các giá trị trả lại từ Tác vụ.WhenAll

IEnumerable<TestResult> results = await Task.WhenAll(myCollection.Select(v => v.TestAsync())); 

Tôi đã thử nhiều cách khác nhau để viết điều này mà không thành công. Có suy nghĩ gì không?

+1

Làm thế nào để 'TestAsync' tìm? – i3arnon

+2

Dòng mã này có vẻ OK. Điều gì không hoạt động chính xác? Bất kỳ lỗi trình biên dịch, ngoại lệ thời gian chạy, vv? – Dennis

+0

Tôi đoán chữ ký 'TestAsync()' của anh ta trông như thế này: 'public async TestResult TestAsync()', thay vì 'public async Task TestAsync()'. –

Trả lời

9

Nếu các tác vụ bạn đang chờ có kết quả cùng loại Task.WhenAll sẽ trả về một mảng. Ví dụ cho lớp này:

public class Test 
{ 
    public async Task<TestResult> TestAsync() 
    { 
     await Task.Delay(1000); // Imagine an I/O operation. 
     return new TestResult(); 
    } 
} 

Chúng tôi nhận được những kết quả này:

var myCollection = new List<Test>(); 
myCollection.Add(new Test()); 

IEnumerable<TestResult> results = await Task.WhenAll(myCollection.Select(v => v.TestAsync())); 
+3

@ I3arnon: đây là cùng mã, mà OP đã viết. Tốt hơn là làm rõ, điều gì không hiệu quả với anh ta. – Dennis

+0

Tôi đã giải thích những gì nên làm việc và tại sao. Tôi đang chờ OP làm rõ những gì không hiệu quả với anh ta. – i3arnon

+3

Tôi là một thằng ngốc - Phương pháp My TestAsync đã trả lại một Tác vụ thay vì một Nhiệm vụ - ngay sau khi tôi thay đổi điều đó, nó đã hoạt động. Cảm ơn vì đã chỉ cho tôi đúng hướng - tôi không thể thấy điều gì đã xảy ra mặc dù nó đã ở trước mặt tôi! – wwarby

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