2016-03-30 32 views
0

私は、異なるスレッドが操作を実行したいかもしれないマルチスレッドアプリケーションを持っています。私はMutexを使って、既に実行中のスレッドが操作を開始しないことを確認しました。メソッド内別のスレッドに、操作が実行中または終了していることを通知します。

System.Threading.Mutex mutex; 
bool isRunning = System.Threading.Mutex.TryOpenExisting(name, out mutex); 
if (!isRunning) 
{ 
    RunMethod(); 
} 

私はミューテックスを作成し、最後にそれを解放しよう:私は、ミューテックスを取り除くにはどうすればよい

var mutex = new Mutex(true, name); 
try{ 
    //do stuff, it takes some time 
} 
finally 
{ 
    //TODO: I want to get rid of Mutex here 
} 

?私がmutex.ReleaseMutex()mutex.Close()と呼んだ後でさえ、それはまだ存在しており、見つけることができるからです。操作が現在実行中か完了したことを通知するにはどうすればよいですか?

これを行う別の方法はありますか?

+2

私はイベントのいずれかを使用することをお勧めします:[ 'AutoResetEvent' ](https://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(v = vs.110).aspx)または['ManualResetEvent'](https://msdn.microsoft.com/ en-us/library/system.threading.manualresetevent(v = vs.110).aspx)を使用します。私にとってより正式な答案を作成するには、ここで十分なコードはありません。 – CodingGorilla

答えて

0

同じように、CodingGorillaのように、イベントを使用する方が簡単です。 あなたの質問をよく理解していただければ幸いです。

  • スレッドが開始されているのを待っ:

    この例では、いくつかのイベントのテクニックを示しています。

  • 複数のイベント(WaitHandle.WaitAny())で待機中の使用
  • 安全、スレッドを終了する方法。ここで
  • テストイベント状態を待たずに(.WaitOne(0))

は一例です:

public class MultiThreadedExample : IDisposable 
{ 
    private Thread _thread; 
    private ManualResetEvent _terminatingEvent = new ManualResetEvent(false); 
    private ManualResetEvent _runningEvent = new ManualResetEvent(false); 
    private ManualResetEvent _threadStartedEvent = new ManualResetEvent(false); 

    public MultiThreadedExample() 
    { 
     _thread = new Thread(MyThreadMethod); 
     _thread.Start(); 
     _threadStartedEvent.WaitOne(); 
    } 

    private void MyThreadMethod() 
    { 
     _threadStartedEvent.Set(); 
     var events = new WaitHandle[] { _terminatingEvent, _runningEvent }; 

     while (WaitHandle.WaitAny(events) != 0) // <- WaitAny returns index within the array of the event that was Set. 
     { 
      try 
      { 
       // do work...... 
      } 
      finally 
      { 
       // reset the event. so it can be triggered again. 
       _runningEvent.Reset(); 
      } 

     } 
    } 

    public bool TryStartWork() 
    { 
     // .Set() will return if the event was set. 
     return _runningEvent.Set(); 
    } 

    public bool IsRunning 
    { 
     get { return _runningEvent.WaitOne(0); } 
    } 

    public void Dispose() 
    { 
     // break the whileloop 
     _terminatingEvent.Set(); 
     // wait for the thread to terminate. 
     _thread.Join(); 
    } 
} 
関連する問題