2013-03-12 41 views
6

Tôi đang học về async/await, và chạy vào một tình huống mà tôi cần gọi một phương thức async để trả về một đối tượng hoặc danh sách cùng một đối tượng.
Đây có phải là cách phù hợp để triển khai không?C# 5.0 async đang chờ trả về một danh sách

từ AManager.cs

public async Task Initialize(string objectPath) 
{ 
    AnObject someObject = await BClass.GetAnObject(objectPath); 
} 

và điều này được được gọi là phương pháp

Class B: 
public async Task<AnObject> GetAnObject(string objectPath) 
{ 
    AnObject someObj = new AnObject(); 
    return someObj; 
} 

gì sẽ xảy ra nếu tôi muốn trả về một danh sách các đối tượng? Tôi nên tạo một wrapper có chứa một danh sách? và trả lại trình bao bọc đó?
Bởi vì đây không phải là áp dụng:

public async Task<List<AnObject>> GetAnObject(string objectPath) 
+2

có thể xây dựng thêm những gì bạn muốn đạt được một chút không? Cụ thể: Bạn muốn trả lại danh sách các đối tượng ở đâu? Trong GetAnObject. Vì sau đó "Tác vụ công khai không đồng bộ > GetAnObject (chuỗi objectPath)" là hoàn toàn hợp lệ. Bạn chỉ cần trả lại danh sách các đối tượng thay vì ... – bigge

Trả lời

2

Tôi không chắc chắn những gì bạn đang cố gắng thực hiện điều đó các Task<List<AnObject>> không áp dụng, nhưng đây là một ví dụ về việc trả lại một Danh sách các anObject trong ví dụ của bạn ở trên

public class AnObject() 
{ 
    SomeProperty {get; set;} 
    Some Method(); 
} 

public class theCollectionofAnObject : IList<AnObject>() 
{ 
    private List<AnObject> _contents = new List<AnObject>; 

    //Implement the rest of IList interface 

} 

//Your async method 
public Task<theCollectionofAnObject> GetAnObjects(parameter) 
{ 
} 
22

Để có thể chạy phương pháp như không đồng bộ, bạn cần phải chờ đợi bên trong. Nếu bạn không có nó, nó sẽ được chạy như phương thức đồng bộ. Đó có thể là lý do tại sao nó không hoạt động cho bạn. Để đạt được điều này bạn có thể làm một cái gì đó như thế này:

public async Task<List<string>> GetList() 
{ 
    return await Task.Run(() => new List<string>() {"a", "b"}); 
} 

Và sau đó chạy nó:

var list = await GetList() 
+0

Nó hoạt động tốt cho tôi! – RolandoCC

+0

Câu trả lời rõ ràng, súc tích, không quá phức tạp dựa trên câu hỏi, cảm ơn bạn rất nhiều! – JimmyV

+0

Câu trả lời tuyệt vời Cảm ơn bạn –

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