2012-06-27 35 views
15

Tôi gặp sự cố khi sử dụng các công cụ async/await mới trong C#. Đây là kịch bản của tôi:Cú pháp để khởi chạy nhiều tác vụ không đồng bộ trong C#

static async Task<bool> ManageSomeRemoteTask(int Id, bool flag) 
{ 
    var result = await serviceClient.AuthenticateIdAsync(Id); 
    [... Setup Some Data ...] 
    await serviceClient.LongAndSlowRemoteCallAsync(Data); 
} 

static void SendATonOfJunkToSomeWebServiceThatDoesntSupportBatches 
{ 
    var myTasks = Dictionary<int, Task<bool>>(); 
    while(IdsLeftToProcess > 0) 
    { 
     Task<bool> t = ManageSomeRemoteTask(Id, true); 
     myTasks.Add(IdsLeftToProcess ,t); 
     myTasks[IdsLeftToProcess].Start(); 
     IdsLeftToProcess --; 
    } 

    Task.WaitAll(myTasks.Values.ToArray()); //Wait until they are all done 
    [... Report statistics ...] 
} 

Tôi có 1 vấn đề ở chỗ khi tôi cố gắng chạy này, tôi nhận được một InvalidOperationException trên Start() với thông báo lỗi " Bắt đầu có thể không được gọi vào một nhiệm vụ hứa hẹn mang phong cách "Thông báo lỗi này dường như không xuất hiện trong Google hoặc Bing nên tôi không chắc nó có ý nghĩa gì. Đây là mối quan tâm số một của tôi, làm thế nào để có được điều này để chạy. Tôi cũng đã thử TaskFactory.StartNew() nhưng không hiểu làm thế nào để vượt qua các tham số cho phương pháp của tôi theo cách đó.

+1

Mặc dù ý kiến ​​của tôi là dòng không nên ở đó, bạn sẽ tiết kiệm một chút thời gian bằng cách không kéo thứ gì đó bạn đã tham chiếu ra khỏi từ điển ... 'myTasks [IdsLeftToProcess] .Start();' sẽ được đại diện tốt hơn bởi 't.Start()' (nếu nó là cần thiết ở nơi đầu tiên) – spender

Trả lời

26

Tác vụ được trả về bằng các phương pháp không đồng bộ luôn là nóng tức là chúng được tạo trong trạng thái Đang chạy. Hãy thử xóa task.Start() khỏi mã của bạn - nó sẽ sửa chữa nó.

Một trích dẫn từ Stephen Toub's Async/Await FAQ:

Tôi có cần phải “Start” Nhiệm vụ tạo ra bằng các phương pháp đánh dấu là “async”?

Không. Nhiệm vụ được trả về từ phương pháp TAP là "nóng", nghĩa là các tác vụ đại diện cho các hoạt động đang được tiến hành. Không chỉ làm bạn không cần phải gọi “.Start()” trên các nhiệm vụ như vậy, nhưng làm như vậy sẽ thất bại nếu bạn cố gắng. Để biết thêm chi tiết, hãy xem Câu hỏi thường gặp về Task.Start.

+0

Tài liệu tham khảo? –

+1

@Jonathon Reinhart - đã thêm tham chiếu, cảm ơn bạn đã chỉ ra – alexm

+0

Thật dễ dàng để bỏ lỡ một chút thông tin như vậy. Cảm ơn đã giúp đỡ. – Jason

9

Bạn không cần khởi động Tác vụ được trả về bằng cuộc gọi phương thức không đồng bộ. Chúng được khởi động theo mặc định.

+3

Trên thực tế, bạn * không thể * bắt đầu chúng. – svick

+1

Đó không phải là câu hỏi của tất cả về? – spender

+3

Bạn nói rằng bạn không cần phải bắt đầu chúng, điều đó hàm ý bạn có thể nếu bạn muốn. Nhưng điều đó không đúng. – svick

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