C#.NETのスレッドの最初のステップ

読者の皆様、この記事では、.NET環境をマルチタスクプログラミングするための、マルチスレッドのような重要なツールについてお話したいと思います。 この記事には背景情報が含まれており、C#でのマルチスレッドの基本をすばやく学習することを目的としています。 ただし、タスクを並行して実行する利点については説明せず、コードの例に進みます。



using System; using System.Threading; //      namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Thread myThread = new Thread(func); //    (Thread) myThread.Start(); //  for (int i = 0; i < 10; i++ ) { Console.WriteLine(" 1  " + i); Thread.Sleep(0); } Console.Read(); //   } //     static void func() { for (int i = 0; i < 10; i++) { Console.WriteLine(" 2  " + i.ToString()); Thread.Sleep(0); }
      
      



このプログラムで注意すべきこと。 これは主にSystem.Threading名前空間です。 この名前空間には、マルチスレッドプログラミングをサポートするクラスが含まれています。 そして、それはThreadクラスが含まれる場所であり、後でコードで使用します。

次に、ストリームオブジェクトを作成します。

 Thread myThread = new Thread(func);
      
      





このクラスのコンストラクターは、 voidを返す関数の名前を渡す必要があります 。これは、実際には並列スレッドで呼び出されます。 その後、新しく作成されたストリーム内で定義されたStart()メソッドを使用してストリームを開始します。



したがって、メインスレッドとセカンダリスレッドは、ほぼ同一のコードを同時に実行し、独自の番号を呼び出す前に9にカウントします(最初から発生します)。 静的なThread.Sleep(0)メソッドに注意してください。 パラメーターで指定されたミリ秒数の間、それを引き起こしたスレッドを中断します。 ただし、この場合、パラメータ0が渡されるため、別のスレッドを実行できるようにするには、スレッドを一時停止する必要があります。



そして、コンソールが事前に閉じないように、キーボード入力( Console.Read )を待機します。その結果、プログラムはコンソールに次を出力します。

スレッド1出力0

ストリーム2出力0

ストリーム1出力1

ストリーム1出力2

ストリーム1出力3

ストリーム2出力1

<...>など



出力結果は毎回異なりますが。 多くの要因に依存しますが、優先度とバックグラウンドの2種類のフローがあることを考慮する価値があります。 バックグラウンドスレッドは、優先度が流れると自動的に終了します。 デフォルトでは、 Main関数は優先スレッドで起動され、残りのスレッドはバックグラウンドで作成されます。 そのため、メインスレッドがデリバティブの終了前に終了しないようにする必要があります。 これを防ぐために、ストリームがアクティブな場合にtrueを返すIsAliveフィールドを使用できます。 または、 Join()メソッド。呼び出されたスレッドが、それが属するスレッドの完了を待機させます。



ただし、フローのタイプは自分で変更できます。 IsBackgroundストリームプロパティは、ストリームがバックグラウンドかどうかを決定します。 したがって、フローを優先することができます。 myThread.IsBackground = false;



ただし、 Mainメソッド内に新しいスレッドを作成する必要はありません。 独自のコンストラクターで新しいスレッドを開くクラスを作成しましょう。 作成したクラスは引き続きカウントを処理しますが、今回はパラメーターをストリームに渡すことにより、指定した数にカウントします。



 using System; using System.Threading; namespace ConsoleApplication1 { class Program { class myThread { Thread thread; public myThread(string name, int num) //          { thread = new Thread(this.func); thread.Name = name; thread.Start(num);//    } void func(object num)// ,   { for (int i = 0;i < (int)num;i++ ) { Console.WriteLine(Thread.CurrentThread.Name + "  " + i); Thread.Sleep(0); } Console.WriteLine(Thread.CurrentThread.Name + " "); } } static void Main(string[] args) { myThread t1 = new myThread("Thread 1", 6); myThread t2 = new myThread("Thread 2", 3); myThread t3 = new myThread("Thread 3", 2); Console.Read(); } } }
      
      



この例を分析しましょう。 myThreadクラスのコンストラクターは、2つのパラメーターを取ります。スレッドの名前を決定する行と、ループ内でカウントが保持される番号です。 コンストラクターで、このオブジェクトのfunc関数に関連付けられたスレッドを作成します。 次に、作成したストリームのNameフィールドを使用してストリームに名前を付けます。 そして、 Start関数に引数を渡して、フローを開始します。



ストリームによって呼び出される関数は、引数が1つだけで、オブジェクト型のみをとることができることに注意してください。 func関数では、 forループは引数として渡された数にカウントされ、ストリームは終了します。 Main関数では、3つのテストオブジェクトを作成します。その操作により、コンソールに次のテキストが表示されます。



スレッド1出力0

スレッド1出力1

スレッド2出力0

スレッド2出力1

スレッド2出力2

スレッド2は終了しました

<...>



この例では、記事を完成させたいと思います。 また、ストリームを操作する多くの手段は私に影響されませんでしたが、私から提供された情報が役立つことを願っています。



All Articles