asp.Netスレッドの作成と終了(マルチスレッド)


この例では、補助スレッドが実行するメソッドDoWorkを含むWorkerというクラスを作成します.これは実際には補助スレッドのMain関数である.セカンダリ・スレッドは、このメソッドを呼び出すことで実行を開始し、このメソッドが返されると自動的に終了します.DoWorkメソッドは次のとおりです.
public void DoWork() { while (!_shouldStop) { Console.WriteLine("worker thread: working..."); } Console.WriteLine("worker thread: terminating gracefully."); }  
 
Workerクラスには、DoWorkが戻るべきであることを通知する別の方法があります.このメソッドの名前はRequestStopです.次のようになります.
public void RequestStop() { _shouldStop = true; }  
 
RequestStopメソッドは、trueを_に割り当てるだけです.shouldStopデータメンバー.このデータ・メンバーはDoWorkメソッドによってチェックされるため、間接的にDoWorkが戻され、補助スレッドが終了します.ただし、DoWorkとRequestStopは異なるスレッドで実行されることに注意してください.DoWorkはセカンダリスレッドによって実行され、RequestStopはプライマリスレッドによって実行されるので_shouldStopデータメンバーはvolatileとして宣言され、以下のようになります.
private volatile bool _shouldStop;  
 
 
volatileキーワードはコンパイラに通知するために使用され、複数のスレッドがアクセスされます.shouldStopデータ・メンバーなので、このメンバーのステータスを最適化する仮定は必要ありません.詳細については、volatile(C#リファレンス)を参照してください.
volatileと_shouldStopデータメンバーを使用すると、正式なスレッド同期技術を使用する必要がなく、複数のスレッドからこのメンバーに安全にアクセスできますが、これは_shouldStopはboolです.これは、単一の原子操作を実行するだけで変更できることを意味します.shouldStop.ただし、このデータ・メンバーがクラス、構造、または配列である場合、複数のスレッドからアクセスすると、間欠的なデータが破損する可能性があります.配列内の値を変更するスレッドがあるとします.Windowsは定期的にスレッドを中断し、他のスレッドが実行できるようにします.したがって、このスレッドは、特定の配列要素が割り当てられた後、および他の要素が割り当てられる前に停止します.配列にはプログラマが望んでいない状態があるため、この配列の別のスレッドを読み込むと失敗する可能性があります.
実際に補助スレッドを作成する前に、Main関数はWorkerオブジェクトとThreadのインスタンスを作成します.スレッドオブジェクトは、Workerに対する.DoWorkメソッドの参照は、以下に示すように、Threadコンストラクション関数に渡されます.
 
 
Worker workerObject = new Worker(); Thread workerThread = new Thread(workerObject.DoWork);  
 
このとき、補助スレッドオブジェクトは既に存在し、構成されていますが、実際の補助スレッドは作成されていません.MainがStartメソッドを呼び出すと、実際の補助スレッドが作成されます.
workerThread.Start();  
 
 
このとき、システムは補助スレッドの実行を開始しますが、これはメインスレッドとは非同期で実行されます.これは,Main関数が補助スレッドを初期化しながらコードを実行し続けることを意味する.Main関数が補助スレッドが実行される前に終了しないようにするには、補助スレッドオブジェクトのIsAliveプロパティがtrueに設定されるまで、Main関数がループします.
 
while (!workerThread.IsAlive);
 
 
   ,     Sleep 
         。          DoWork     MainDoWork
Thread.Sleep(1);
 
 
  1     ,MainWorker.RequestStop   (     )    :
workerObject.RequestStop();
 
 

Abort 。 , , 。 。

Main Join 。 , 。 , ,Join , :

 

workerThread.Join();

 

 

Main 。 , , 。

 

using System; using System.Threading; public class Worker { // This method will be called when the thread is started. public void DoWork() { while (!_shouldStop) { Console.WriteLine("worker thread: working..."); } Console.WriteLine("worker thread: terminating gracefully."); } public void RequestStop() { _shouldStop = true; } // Volatile is used as hint to the compiler that this data // member will be accessed by multiple threads. private volatile bool _shouldStop; } public class WorkerThreadExample { static void Main() { // Create the thread object. This does not start the thread. Worker workerObject = new Worker(); Thread workerThread = new Thread(workerObject.DoWork); // Start the worker thread. workerThread.Start(); Console.WriteLine("main thread: Starting worker thread..."); // Loop until worker thread activates. while (!workerThread.IsAlive); // Put the main thread to sleep for 1 millisecond to // allow the worker thread to do some work: Thread.Sleep(1); // Request that the worker thread stop itself: workerObject.RequestStop(); // Use the Join method to block the current thread // until the object's thread terminates. workerThread.Join(); Console.WriteLine("main thread: Worker thread has terminated."); } } : main thread: starting worker thread... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: working... worker thread: terminating gracefully... main thread: worker thread has terminated

 

 

。 sleep , 。