2012-03-19 8 views
2

私は100スレッドを持っています。別のスレッドが実行される前に10スレッドを実行して、スレッド配列のままにしておきたい。誰か助けてくれますか?C#のスレッドのブロックグループ

私の英語については申し訳ありません。少し早いですがお礼を。

+0

本当に100スレッドが必要ですか?あなたが望むように聞こえるのは、あなたが "仕事"を割り当てることができる "スレッドのプール"のようなものです... –

+0

あなたの質問は論理的に意味が分かりません。 – TomTom

+0

Hey Hung、他の10個のスレッドが起動するまで10個のスレッドをブロックする方法を求めていますか? – Tung

答えて

2

次のコードは10個のタスクを開始し、次の10個のタスクを開始する前に完了するまで待機します。注意すべき点の1つは、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

Task Parallel Libraryをチェックしてください。

Hereは、並列化の程度を手動で制御できるように見える代わりのスケジューラーです。

2

あなたはTPLであなたの仕事を達成できるようです。タスクを実行し、Task.WaitAll()で完了を待つか、別のタスクを実行して、完了した後に何かを行うにはContinueWithを使用します。例えば、UIスレッド...その他のコードを実行してください... hereを参照してください。 Albahariのウェブサイトにはparallel programmingに関する記事があります。あなたはそれを読むことができます、本当に素敵な書かれた。