2009-09-02 6 views
3

可能な重複質問:私のコードでIs there a way to indefinitely pause a thread?再開C#のスレッド


は、私はそれが中断されてhasntとき、私は履歴書を呼び出すので、私は以下の例外を取得

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) 
     { 
     } 

答えて

7

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

しかし、再開は/ APIをサスペンドが実際に廃止されて、例えば、見てみましょう:

1)Monitor、(待って)とパルス()

2)AutoResetEventまたはManualResetEvent、セット()静的クラスMonitorは少し使いやすく、lock() {}と統合されていますが、SetEventまたはUnsetモードで作成することができるため、ResetEventがより適切な場合があります。シグナル。対照的に、Monitor.Pulse()は、Wait()が後で発生したときに失われます。


ウィルは、あなたの質問にリンクを挿入し、そして私はそれが重複考慮しない一方で、サスペンド/レジューム使用してからあなたを硬化するのに適しthe accepted answerあります。

0

あなたは、この場合にスレッドモニターを使用して見てみましょうする場合がありますを書いて嫌い。

2

ここでは、WaitHandlesの方が優れています。

スレッドを一時停止する代わりに、スレッドを待ちます。もう一度起動する準備ができたら、もう一方のスレッドからハンドルを「セット」します。

コード例については、MSDN's documentation of ManualResetEventを参照してください。