2017-11-01 16 views
0

私はC#マルチスレッドを学びたいと思っています。この質問は愚かかもしれませんが、とにかく私は依頼します。学習課題[]

質問:私は置くべき場所 thread.wait()方法を(私は右の質問を求めている場合)を把握しようとしている

。したがって、コンソールにすべての子スレッドを表示することができます。これは私が望む出力です。

私は、入力されたint num 3.

これは、(私がブレークポイントでこれを実行している)を出力する必要があります:

enter image description here

これは、現在の出力です:

enter image description here

ここに私のコードです:

namespace ConsoleApp2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Input number of threads: "); 
      int num = Convert.ToInt32(Console.ReadLine()); 

      Task[] TaskArray = new Task[num]; 

      for (int i = 0; i <= num-1; i++) 
      { 
       TaskArray[i] = Task.Run(() => { DifferentMethod(i); });     
      } 

      for (int i = 0; i <= num - 1; i++) 
      { 
       TaskArray[i].Wait(); 
      } 
     } 
     static void DifferentMethod(object ThreadID) 
     { 
      while (true) 
      { 
       Console.WriteLine("{0} is Running",ThreadID);     
       Thread.Sleep(500); 
      } 
     } 
    } 
} 
+7

タスクを完了するためにメインスレッドはその時点でお待ちしております!=スレッド。 –

+0

'Task.Run' ==スレッド –

+1

@BradleyUffner no。あなたが 'Task.Run'で100万のタスクを作成すると、それらを実行するスレッドは100万個になると思いますか? –

答えて

5

これはあなたの待っている部分とは関係ありません。

はあなたの変数のローカルコピーを作成する必要があります。

あなた iが(もっと良い言葉がないために)「捕獲」されているが、それはすでにそれまでに変更されているので
for (int i = 0; i <= num-1; i++) 
{ 
    int localCopy = i; 
    TaskArray[i] = Task.Run(() => { DifferentMethod(localCopy); });     
} 

。したがって、キャプチャがローカルコピー上にあるようにローカルコピーを作成します。変更されることはありません。

+0

Thx for help ..それは働きます。 – k9nneo1191

+1

@ k9nneo1191また、(あなたのコードを正しく理解していれば) 'TaskArray [0]'だけを待ち、決して完了しないので永遠にそれを待つことに注意してください。 –

+0

oh。私は、メインスレッドがちょうど子スレッドを作成し、その途中で行くループのために作られたと思った。そして、子スレッドはループ中にメソッドに行き、決して完了しません。追加の知識のためにthx。 – k9nneo1191

0

あなたはTaskクラスTask.WaitAll(TaskArray)から静的メソッドを使用することができ、すべてのタスクが