との 2 つのメソッドは、.NET 2.0 以降Thread.Suspend()
では廃止されています。Thread.Resume()
なんで?他の代替案と例は何ですか?
8 に答える
AutoResetEventEventWaitHandleを使用することをお勧めします。
このようなことをしたいとします(注:これはしないでください!):
private Thread myThread;
private void WorkerThread()
{
myThread = Thread.CurrentThread;
while (true)
{
myThread.Suspend();
//Do work.
}
}
public void StartWorking()
{
myThread.Resume();
}
他の人が言っているように、これは悪い考えです。独自のスレッドでSuspendを使用することは比較的安全ですが、スレッドが実際に中断されたときにResumeを呼び出しているかどうかを判断することはできません。そのため、SuspendとResumeは廃止されました。
代わりに、AutoResetEventを使用します。
private EventWaitHandle wh = new AutoResetEvent();
private void WorkerThread()
{
while(true)
{
wh.WaitOne();
//Do work.
}
}
public void StartWorking()
{
wh.Set();
}
ワーカースレッドは、別のスレッドがStartWorkingを呼び出すまで待機ハンドルを待機します。AutoResetEventでは1つのスレッドのみを「再開」できるため、Suspend/Resumeとほぼ同じように機能します。
適切な代替手段はすべて、スレッドが喜んで待機できるポイントに到達することによって機能します。サスペンドは、スレッドがミューテックスのロックを保持している間にスレッドをサスペンドする可能性があるため、危険でした (デッドロックのレシピ)。
したがって、スレッドが必要とするのは、ロックを保持していないときに安全に待機できる ManualResetEvent です。
これは Thread のこれまでで最高のチュートリアルです (C# 用): http://www.albahari.com/threading/
待機するには、スレッドで . Join() を使用する必要があります。これは、トレッド仕上げが仕事になるまで待ちます。それ以外の場合は、 Wait/Pulseを使用する必要があります。
あれは長すぎる。必要なのは、使用する簡単なサンプル コードです。ディスカッションから 1 つを見つけ、Mark R. Dawson がhttp://bytes.com/groups/net-c/458947-thread-suspendで回答しました。廃止されたメソッドの危険性と、AutoResetEvent を使用して 2 番目のスレッドに処理を続行するよう通知する方法について説明します。
素晴らしいチュートリアルだと思います。Suspend() と Resume() が廃止された主な理由は、かなり危険なメソッドだからです。いつでも、スレッド t は何でもできます。なんでも。あなたのスレッドがファイルを読んでいて、それをロックしていると想像してください。スレッドを中断します。ファイルはロックされたままです。他のリソースについても同様です。同じことがミューテックスのロックにも当てはまります。