3

重複する可能性のある質問: スレッドを無期限に一時停止する方法はありますか?


私のコードでは、以下を行います

Thread mainThread
//...
mainThread.Resume();

void StartThread()
{
    while (!wantQuit)
    {
        db.runEmail();
        mainThread.Suspend();
    }
}

次に、中断されていないときに再開を呼び出すため、以下の例外が発生します。

System.Threading.ThreadStateException

この警告に気づきました

warning CS0618: 'System.Threading.Thread.Resume()' is obsolete: 'Thread.Resume has been deprecated.  Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.  http://go.microsoft.com/fwlink/?linkid=14202'

だから、中断されていない例外/ケースを再開して無視する方法はあるのだろうか? 1行だけではなく、以下を書くのは嫌いです

        try
        {
            mainThread.Resume();
        }
        catch (System.Threading.ThreadStateException e)
        {
        }
4

4 に答える 4

7

簡単な解決策は、ロジックを修正し、Suspended() でないときに Resume() を呼び出さないことです。

しかし、Resume/Suspend API は実際には非推奨です。たとえば、次のように見てください。

1) Monitor、 Wait() および Pulse()

2) AutoResetEventまたは ManualResetEvent、Set() および WaitOne()

静的クラス Monitor は少し使いやすく、 と統合されてlock() {}いますが、設定モードまたは設定解除モードで作成でき、信号を「見逃す」可能性が低いため、ここでは ResetEvent の方が適している可能性があります。対照的に、Monitor.Pulse() は、後で Wait() が発生したときに失われます。


あなたの質問にリンクを挿入します。私はそれを重複とは見なしませんが、そこで受け入れられた回答は、一時停止/再開の使用からあなたを治すのに適しています.

于 2009-09-02T18:07:38.870 に答える
2

ここでは、WaitHandles を使用することをお勧めします。

スレッドを中断する代わりに、待機ハンドルで待機させます。再び開始する準備ができたら、他のスレッドからハンドルを「設定」します。

コード例については、MSDN の ManualResetEvent のドキュメントを参照してください。

于 2009-09-02T18:13:00.047 に答える
0

この場合、スレッド モニターの使用を検討することをお勧めします。

于 2009-09-02T17:59:35.470 に答える
0

再開する前に、 Thread.ThreadStateを確認し、ThreadState.Suspendedを確認できます。

于 2009-09-02T18:07:18.747 に答える