バックグラウンドスレッドを開始するクラスがあるとします。このクラスには、Run()
これらのスレッドを開始するメソッドと、スレッドをStop()
適切に停止するメソッドが含まれている可能性があります。これらのバックグラウンドスレッドの一部は手動で作成された可能性があり、その他は上記のメソッドが呼び出されTimer
たときにアクティブ化されるによって管理される可能性があります。Run()
public void Run()
{
m_ShutdownRequested = false; // shutdown flag disabled
m_WorkerThread = new Thread(Work) { IsBackground = true };
m_WorkerThread.Start();
// ...
}
public void Stop()
{
lock (m_LockInput)
{
m_ShutdownRequested = true; // shutdown flag enabled
Monitor.Pulse(m_LockInput);
}
m_WorkerThread.Join(m_ShutdownTimeout);
}
ユーザーがUIの[実行]ボタンをクリックしたときにRun()
メソッドが呼び出されたとします。同様に、ユーザーがUIの[停止]ボタンをクリックすると、メソッドが呼び出されます。UIを介して呼び出すには、これらのメソッドをどのように実装する必要がありますか?それらは両方とも非同期である必要がありますか?はいの場合、一部のスレッドが停止できない可能性に対処するにはどうすればよいですか?Stop()
メソッドの実行後Stop()
、一部のスレッドが停止しなかったとします。この時点で、ユーザーが[実行]ボタンをもう一度クリックすると、そのクラスのインスタンスには、まだ停止されていないスレッドがいくつかあります。ただし、Run()
メソッドを開始すると、前のm_WorkerThread
インスタンスが上書きされます。スレッドがまだ終了していないときにこの上書きが実行されるとどうなりますか?