public void ScheduleWorkerTest()
        {
            var startTime  = DateTime.Now;
            var timeStamps = new List <DateTime>();
            var w          = new ScheduleWorker(() =>
            {
                timeStamps.Add(DateTime.Now);
            }, DateTime.Now.AddSeconds(5), TimeSpan.FromSeconds(5));

            w.Start();
            Thread.Sleep(TimeSpan.FromSeconds(16));

            w.Stop();
            Assert.AreEqual(3, timeStamps.Count);
            for (int i = 0; i < 3; i++)
            {
                var expectTime = startTime.AddSeconds((i + 1) * 5);
                var actualTime = timeStamps[i];
                Assert.IsTrue(1 >
                              Math.Abs((expectTime - actualTime).TotalSeconds));
            }
        }
 public static void StopScheduleThread()
 {
     try
     {
         if (_scheduleThreadAnalyticDebugOn)
         {
             ScheduleLog.Debug("Enter StopScheduleThread()");
         }
         if (_scheduleThread != null)
         {
             if (_scheduleThreadAnalyticDebugOn)
             {
                 ScheduleLog.Debug("Try to stop the _scheduleThread");
             }
             _scheduleWorker.RequestStop();
             _scheduleThread.Join(20000);
             _scheduleWorker = null;
             _scheduleThread = null;
         }
         else
         {
             if (_scheduleThreadAnalyticDebugOn)
             {
                 ScheduleLog.Debug("_scheduleThread is not running");
             }
         }
         if (_scheduleThreadAnalyticDebugOn)
         {
             ScheduleLog.Debug("Exit StopScheduleThread()");
         }
     }
     catch (Exception ex)
     {
         ScheduleLog.Error("Exit StopScheduleThread() with Exception error: " + ex.Message);
     }
 }
        public static void StartScheduleThread(HttpContext httpContext, IConfiguration configuration = null)
        {
            try
            {
                GetConfigParams(configuration);
                SetHttpRuntimeUrl(httpContext);
                if (_scheduleThreadAnalyticDebugOn)
                {
                    ScheduleLog.Debug($"Enter StartScheduleThread() with User: [{httpContext?.User}], Enabled: [{_scheduleThreadEnabled}], WorkIntervalInMsec: [{_scheduleThreadWorkIntervalInMsec}], HttpRequestTimeOutMin: [{_scheduleThreadHttpRequestTimeOutMin}]"
                                      );
                }
                //_log.DebugFormat("Found {0} Active Schedules.", schedules.Count);
                if (!_scheduleThreadEnabled)
                {
                    if (_scheduleThreadAnalyticDebugOn)
                    {
                        ScheduleLog.Debug("Exit StartScheduleThread() !_scheduleThreadEnabled");
                    }
                    return;
                }
                HttpContext lHttpContext = httpContext ?? Utilities.Web.GetContext();
                if (_scheduleThread != null)
                {
                    if (_scheduleThreadAnalyticDebugOn)
                    {
                        ScheduleLog.Debug("_scheduleThread is already running");
                    }
                    return;
                }
                _scheduleWorker = new ScheduleWorker(Manager);
                _scheduleThread = new Thread(new ThreadStart(() =>
                {
#if NETFRAMEWORK
                    HttpContext.Current = lHttpContext;
                    _scheduleWorker.DoWork();
#else
                    using (var scope = Manager.CreateThreadServiceScope())
                    {
                        ServiceLocator.SetLocatorProvider(scope.ServiceProvider);
                        _scheduleWorker.DoWork();
                    }
#endif
                }));
                _scheduleThread.Start();
                while (!_scheduleThread.IsAlive)
                {
                    if (_scheduleThreadAnalyticDebugOn)
                    {
                        ScheduleLog.Debug("StartScheduleThread !_scheduleThread.IsAlive, wait.....");
                    }
                    Thread.Sleep(100);
                }
                if (_scheduleThreadAnalyticDebugOn)
                {
                    ScheduleLog.Debug("Exit StartScheduleThread()");
                }
            }
            catch (Exception ex)
            {
                ScheduleLog.Error("Exit StartScheduleThread()() with Exception error: " + ex.Message);
            }
        }