簡體   English   中英

是否可以重構此EventWaitHandle以不使用Thread.Sleep()來控制競爭條件?

[英]Is it possible to refactor this EventWaitHandle to not use Thread.Sleep() to control the race condition?

我想從服務器向所有客戶端發送消息。 有0- *個客戶端。 加載客戶端時,服務器可能正在運行或可能未運行。 這里的功能按我的需要工作。 我試圖弄清楚是否可以在沒有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();
        }
    }
}

我想這取決於您是否確定所有客戶都將在一秒鍾內獲得他們的時間。 這聽起來很合理,但是在極大的壓力下,有些客戶可能會錯過它。 這有多重要?

無論如何,我認為這正是您應該使用ZeroMQ進行的事情。 它重量輕,可以為您解決所有潛在的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM