在c#中的多线程窗口服务中使用Bool标志是否安全?

时间:2017-08-21 22:05:17

标签: c# multithreading windows-services boolean

我们有一个运行while循环的Windows服务,并监视数据库中的挂单。它运行正常但是我们注意到在高负载环境中它打开了两个线程而不是一个。

在此代码中,当调用StartService()时,它会在DB中打开一个新线程并处理订单。此代码应始终只调用一次启动服务,但为什么我们看到多个线程打开?你看到这个设计的任何错误吗?

这里Queue.IsFull是一个挥发性的Bool旗帜。

    public static void StartWork()
    {
        bool started = false;
        //Infinite Loop
        while (continueWork)
        {                
            try
            {
                //Bool flag to prevent back to back call
                if (started == false)
                {
                    started = true;

                    // Do work only if Any Pending Request in Database.
                    if (AppSettings.AnythingToPRocess() == true)
                    {

                        if (Queue.IsFull == false)
                        {
                            StartService(); //set Queue.IsFull to True inside
                        }
                    }

                    started = false;
                }
            }
            catch (Exception exp)
            {
                LogError("Failed to Start" , exp);                    
            }
            finally
            {
                System.Threading.Thread.Sleep(5000); //5 seconds
            }

         }
    }

    private static void StartService()
    {
        // Set Flag to false here to prevent back to back calls
        Queue.IsFull = true;
        Log("Service started");
        Thread ServiceThread = new Thread(() =>
        {
            Service service = new Service();
            service.Process();
        });

        ServiceThread.Name = "Thread1";
        ServiceThread.Start();
    }

2 个答案:

答案 0 :(得分:2)

睡眠(5)不是5秒,它是毫秒。

除非出现异常,否则start始终为false,因此如果StartService是异步的,则try块将再次运行。

答案 1 :(得分:0)

正如我从你的帖子中可以理解的那样,你正在启动服务并且它在不同的线程中运行。在这种情况下,通过退出服务,started标志应设置为false