2012-03-19 86 views
2

我有100個線程。我想在另一個線程運行之前運行10個線程,並繼續保留線程數組。有誰能夠幫助我?在C中阻塞線程組#

對不起,我的英語。預先感謝。

+0

你真的需要100個線程嗎?聽起來像你想要的是更多的「線程池」,你可以將「任務」分配給... – 2012-03-19 07:49:15

+0

請更準確地解釋你想要做什麼,因爲簡單地說 - 你的問題在邏輯上毫無意義。 – TomTom 2012-03-19 07:52:47

+0

嗨,洪,你是否要求阻止10個線程運行,直到10個其他(特定)線程已經開始? – Tung 2012-03-19 07:53:17

回答

2

以下代碼將啓動10個任務,並在開始下一個10個任務之前等待它們完成。謹慎的一句話是,10個任務開始的順序不能保證。也就是說,這個例子將阻塞,直到10的設置完成,但是任務1可以在任務0之前開始:

private static void Main() 
{ 
    List<Task> tasks = new List<Task>(); 
    for (int i = 0; i < 100; i++) 
    { 
     if (i % 10 == 0) 
     { 
      Console.WriteLine("Waiting for all tasks to complete"); 
      Task.WaitAll(tasks.ToArray()); 
      Console.WriteLine("All tasks have completed. Continuing..."); 
      tasks.Clear(); 
     } 

     tasks.Add(Task.Factory.StartNew(TrivialTask, new TaskState(i))); 
    } 
} 

public class TaskState 
{ 
    public TaskState(int id) 
    { 
     TaskId = id; 
    } 

    public int TaskId { get; set; } 
} 

private static void TrivialTask(object state) 
{ 
    TaskState taskState = (TaskState) state; 
    Thread.Sleep(1000); 
    Console.WriteLine("Task " + taskState.TaskId + " completed"); 
} 
2

似乎你可以用TPL完成你的任務。運行任務,等待他們完成與Task.WaitAll(),運行另一堆任務,使用ContinueWith完成後,仍然執行其他代碼,例如,UI線程...閱讀關於它here並查看一些源代碼。在Albahari的網站上有更多關於parallel programming的文章。你可以閱讀它,它非常好寫。