2012-02-17 19 views
0

我想從服務器向所有客戶端發送消息。有0- *個客戶。客戶端加載時服務器可能運行,也可能不運行。這裏的功能工作如何我想要它。我想弄清楚這是否可以在沒有Thread.Sleep()的情況下完成?另請注意,客戶端和服務器均處於獨立進程中。是否有可能重構此EventWaitHandle不使用Thread.Sleep()來控制競爭條件?

服務器部分

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

我想這取決於您是否是某種所有客戶端都將內得到他們的時間片第二。這聽起來很合理,但在極度壓力下,一些客戶可能會錯過它。那有多關鍵?

無論如何,我認爲這正是您應該使用ZeroMQ的那種東西。它重量輕,併爲您處理所有潛在的錯誤。