2012-05-23 34 views
5

Xin chào, tôi có _noOfThreads là các tác vụ được xác định để chạy cùng một lúc. Vì vậy, tôi tiếp tục Công việc bằng cách sử dụng toán tử % và vào cuối vòng lặp, tôi có Tasks.WaitAll. Đây là đoạn mã.Task.WaitAll không chờ nhiệm vụ con?

for (int index = 0; index < count; index++) 
{ 

       if (index < _noOfThreads) 
        tasks[index] = Task.Factory.StartNew(somedelegate); 
       else 
        tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
          TaskContinuationOptions.AttachedToParent); 
} 
    Task.WaitAll(tasks); 

Tuy nhiên, tôi nhận thấy nó không chờ đợi nhiệm vụ của trẻ hoàn thành. Ngay sau khi hoàn thành nhiệm vụ phụ huynh, dòng tiếp theo sau Task.WaitAll được thực hiện. Làm cách nào để thay đổi mã này để chờ nhiệm vụ con?

+0

có thể trùng lặp của [Task.ContinueWith không hoạt động như thế nào tôi mong đợi] (http://stackoverflow.com/questions/6997480/task-continuewith-not-working-how-i-expected) – mellamokb

+0

Trên ghi chú bên, những gì bạn xuất hiện để làm ở đây là quyết định lập kế hoạch nhiệm vụ. Nếu bạn muốn tùy chỉnh lịch biểu, bạn có thể xem xét xuất phát từ [TaskScheduler] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.aspx). Điều đó nói rằng, các Scheduler mặc định đã làm một công việc khá tốt của không quá tải hệ thống với các chủ đề khi một số lượng lớn các nhiệm vụ được xếp hàng đợi. –

+0

@Dan: Đó không phải là mối quan tâm của tôi. Tôi không biết muốn đưa điều này cho TaskScheduler. Tôi có một biến và tôi muốn bắt đầu công việc nhiều như biến đó chỉ. Trong ngắn hạn, tôi muốn mô phỏng một cái gì đó như Semaphore, nơi bạn xác định số lượng các chủ đề và chỉ có số lượng các chủ đề có thể nhập vào đoạn mã đó tại một thời điểm nhất định. –

Trả lời

8

Tôi nghĩ rằng bạn đang phân bổ Nhiệm vụ của bạn như:

Tasks[] tasks = new Task[ _noOfThreads]; 

Thay đổi mã của bạn là:

Tasks[] tasks = new Task[count]; 

for (int index = 0; index < count; index++) 
{ 

    if (index < _noOfThreads) 
     tasks[index] = Task.Factory.StartNew(somedelegate); 
    else 
     tasks[index] = tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
          TaskContinuationOptions.AttachedToParent); 
} 
Task.WaitAll(tasks); 

Cho nó một thử! Good Luck :)

3

Bạn chỉ đang chờ nhiệm vụ ban đầu. Để chờ tất cả các lần tiếp tục hoàn tất, bạn cần gọi WaitAll về các tác vụ tiếp tục. Cách đơn giản để thực hiện điều này sẽ được phân công lại mỗi công việc tiếp tục trở lại vào biến ban đầu, do đó bạn đang chờ đợi chỉ trên continuations thức:

else 
    tasks[index % _noOfThreads] = 
     tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
         TaskContinuationOptions.AttachedToParent); 

Xem thêm this related question.

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