3

バックグラウンドスレッドを開始するクラスがあるとします。このクラスには、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インスタンスが上書きされます。スレッドがまだ終了していないときにこの上書きが実行されるとどうなりますか?

4

2 に答える 2

3

スレッドは影響を受けずに沿って移動します。一方、あなたはそれに対処する方法を失いました。

于 2012-09-18T01:29:56.543 に答える
2

スレッドの上書きは発生しません。変数の新しいインスタンスを作成して割り当てるだけです。実行中のスレッドは引き続き実行されますが、そのスレッドへの参照がなくなったため、そのスレッドに戻ることはできません。スレッドが終了した後、GCはスレッドインスタンスをクリーンアップする場合としない場合があります。

于 2012-09-18T01:30:31.660 に答える