Exemplo n.º 1
0
 public void RemoveBackgroundTask(BackgroundTask task)
 {
     lock (_obj)
     {
         BackgroundTaskList.Remove(task);
         Log("删除");
     }
 }
Exemplo n.º 2
0
        public void RunBackgroundTask(BackgroundTask task)
        {
            lock (_obj)
            {
                if (BackgroundTaskList.Contains(task))
                {
                    throw new ArgumentException("不能传入重复的任务");
                }

                BackgroundTaskList.Add(task);
                Log("添加任务 " + task.Name);

                // 如果线程还没启动,调用下面代码就启动线程,如果已经启动了,调用下面代码也没事
                Start();
            }
        }
Exemplo n.º 3
0
        private void Run()
        {
            try
            {
                int       waitCount  = 0;
                const int waitToExit = 12;
                while (waitCount < waitToExit)
                {
                    List <BackgroundTask> backgroundTaskList;

                    lock (_obj)
                    {
                        backgroundTaskList = BackgroundTaskList.ToList();
                    }

                    if (backgroundTaskList.Count == 0)
                    {
                        Console.WriteLine("没有任务自己暂停一下" + waitCount);
                        if (waitCount < WaitDelayTimeList.Length)
                        {
                            Thread.Sleep(WaitDelayTimeList[waitCount]);
                            waitCount++;
                        }
                        else
                        {
                            Thread.Sleep(MaxDelayTime);
                            waitCount++;
                        }

                        continue;
                    }

                    waitCount = 0;

                    var minDelayTime = TimeSpan.MaxValue;
                    foreach (var backgroundTask in backgroundTaskList)
                    {
                        var lastTime = (DateTime.Now - backgroundTask.LastStartTime);

                        if (lastTime >= backgroundTask.DelayTime)
                        {
                            backgroundTask.Action();

                            Console.WriteLine(
                                $"{DateTime.Now} {DateTime.Now.Millisecond} 运行 {backgroundTask.Name} 距离上次运行 {(lastTime).Milliseconds} 误差{lastTime.Milliseconds - backgroundTask.DelayTime.Milliseconds}");

                            backgroundTask.LastStartTime = DateTime.Now;

                            var delayTime = backgroundTask.DelayTime;
                            if (delayTime < minDelayTime)
                            {
                                minDelayTime = delayTime;
                            }
                        }
                        else
                        {
                            var delayTime = backgroundTask.DelayTime - (DateTime.Now - backgroundTask.LastStartTime);
                            if (delayTime < minDelayTime)
                            {
                                minDelayTime = delayTime;
                            }
                        }
                    }

                    if (minDelayTime > MaxDelayTime)
                    {
                        minDelayTime = MaxDelayTime;
                    }
                    else if (minDelayTime < MinDelayTime)
                    {
                        minDelayTime = MinDelayTime;
                    }

                    Thread.Sleep(minDelayTime);
                }
            }
            finally
            {
                lock (_obj)
                {
                    _thread = null;
                }

                Log("退出线程");
            }
        }