2012-02-17 3 views
0

サーバーからすべてのクライアントにメッセージを送信します。 0- *クライアントがあります。クライアントがロードされると、サーバーが動作している場合と動作していない場合があります。ここの機能は、私が望む方法で動作します。これがThread.Sleep()なしで実行できるかどうかを判断しようとしていますか?また、クライアントとサーバーはそれぞれ独立したプロセスになっています。Thread.Sleep()を使用して競合状態を制御しないように、このEventWaitHandleをリファクタリングすることは可能ですか?

サーバ部分

class NamedEventsServer 
{ 
    internal static void Main() 
    { 
     const string ewhName = "StickyNoteEwh"; 

     EventWaitHandle ewh = null; 
     bool doesNotExist = false; 
     bool wasCreated; 

     // Attempt to open the named event. 
     try 
     { 
      ewh = EventWaitHandle.OpenExisting(ewhName); 
     } 
     catch (WaitHandleCannotBeOpenedException) 
     { 
      Console.WriteLine("Named event does not exist."); 
      doesNotExist = true; 
     } 
     if (doesNotExist) 
     { 
      // The event does not exist, so create it. 

      ewh = new EventWaitHandle(true, 
       EventResetMode.ManualReset, 
       ewhName, 
       out wasCreated); 

      if (wasCreated) 
      { 
       Console.WriteLine("Created the named event."); 
      } 
      else 
      { 
       Console.WriteLine("Unable to create the event."); 
       return; 
      } 
     } 
     ewh.Set(); 
     Thread.Sleep(1000);//wait one second...giving threads enough time to all respond. Then stop triggering the event. 
     ewh.Reset(); 

     //exit 
    } 
} 

クライアント部分

class NamedEventsClient 
{ 
    internal static void Main() 
    { 
     const string ewhName = "StickyNoteEwh"; 

     while (true) 
     { 
      EventWaitHandle ewh = null; 
      bool doesNotExist = false; 
      bool wasCreated; 
      // Attempt to open the named event. 
      try 
      { 
       ewh = EventWaitHandle.OpenExisting(ewhName); 
      } 
      catch (WaitHandleCannotBeOpenedException) 
      { 
       Console.WriteLine("Named event does not exist."); 
       doesNotExist = true; 
      } 
      if (doesNotExist) 
      { 
       // The event does not exist, so create it. 

       ewh = new EventWaitHandle(false, 
        EventResetMode.ManualReset, 
        ewhName, 
        out wasCreated); 

       if (wasCreated) 
       { 
        Console.WriteLine("Created the named event."); 
       } 
       else 
       { 
        Console.WriteLine("Unable to create the event."); 
        return; 
       } 
      } 
      Console.WriteLine("Wait on the event."); 
      ewh.WaitOne(); 
      Console.WriteLine("Event was signaled."); 
      //Console.WriteLine("Press the Enter key exit."); 
      Thread.Sleep(1000); 
      //Console.ReadLine(); 
     } 
    } 
} 

答えて

0

私はそれはあなたがすべてのクライアントが内でのタイムスライスを得ようとしている特定しているかどうかによって決まると思います2番目にそれは合理的だと思うが、極端なストレスの下ではクライアントがそれを見逃すかもしれないどのように重要なのですか?

とにかく、これはまさにZeroMQを使うべきものだと思います。それは軽量で、潜在的なバグをすべて処理します。

関連する問題