Beispiel #1
0
 /// <summary>
 /// 异步执行超时查询,然后删除所有超时查询对象
 /// </summary>
 private static void ExecuteExpire(Object state)
 {
     try
     {
         if (m_expire.Count == 0)
         {
             return;
         }
         List <double> t = new List <double>();
         foreach (var item in m_expire)
         {
             if (item.Key > GetSeconds(DateTime.Now))
             {
                 break;
             }
             t.Add(item.Key);
         }
         if (t.Count != 0)
         {
             foreach (var item in t)
             {
                 var v = m_expire[item];
                 if (v != null && v.Count() != 0)
                 {
                     foreach (var objs in v)
                     {
                         if (objs == null)
                         {
                             continue;
                         }
                         var obj = objs as ExpiredTimeObject;
                         //移除此对象的缓存值
                         obj.Cache.Remove(obj.Key);
                     }
                 }
                 //移除当前的时间
                 m_expire.Remove(item);
             }
         }
     }
     //捕获所有的异常
     catch (Exception e)
     {
         LogHelper.Critical("定时报错,错误日志为:" + e.ToString());
     }
     finally
     {
         m_timer.Change(1000 * 1, Timeout.Infinite);
     }
 }
Beispiel #2
0
        private void LogAction()
        {
            int i = 0;

            while (i++ < 30)
            {
                LogHelper.Debug("xxxxxx");
                LogHelper.Critical("xxxxxx");
                LogHelper.Error("xxxxxx");
                LogHelper.Info("xxxxxx");
                LogHelper.Trace("xxxxxx");
                LogHelper.Warn("xxxxxx");
            }
        }
Beispiel #3
0
 public static T ToObject <T>(this String obj)
 {
     try
     {
         if (String.IsNullOrWhiteSpace(obj))
         {
             return(default(T));
         }
         return(JsonConvert.DeserializeObject <T>(obj));
     }
     catch (Exception e)
     {
         LogHelper.Critical(obj, $"转成{typeof(T)}类型时候报错");
         throw e;
     }
 }
Beispiel #4
0
        /// <summary>
        /// 定时任务执行程序
        /// </summary>
        /// <param name="state"></param>
        public void Register(Object state)
        {
            Int32    num  = 2;
            DateTime date = DateTime.Now;
            Queue <ITriggerExecute> all = TriggerStack.GetAll();
            Int32 count = all.Count;

            while (Volatile.Read(ref count) > 0)
            {
                try
                {
                    if (all.Count == 0)
                    {
                        //超时直接丢弃
                        Thread.Sleep(10);
                        continue;
                    }
                    //开启线程超过2个,那么就等10ms重新循环,避免始终执行线程操作
                    //注意,这里会出现如果队列只剩2个数据时候,会在第二次执行
                    //完毕后,有一个线程出现死锁,那么会出现死锁状态丢弃状态
                    Interlocked.Decrement(ref num);
                    var item = all.Dequeue();
                    date = DateTime.Now.AddSeconds(10);
                    if (!TryAdd(item))
                    {
                        continue;
                    }
                    Task.Run(() =>
                    {
                        ExecuteTrigger(item);
                        Interlocked.Decrement(ref count);
                        if (Volatile.Read(ref num) < 2)
                        {
                            Interlocked.Increment(ref num);
                        }
                    });
                    //给线程一个超时时间,如果当前线程超时1分钟,
                    //那么会被丢弃并且记录日志
                    //如果所有线程执行完毕后,就继续执行下一笔数据
                    //Warn,如果所有的数据都丢失,那么会产生大量的后台线程执行
                    while (Volatile.Read(ref num) <= 0)
                    {
                        if (DateTime.Now < date)
                        {
                            Thread.Sleep(10);
                        }
                        else
                        {
                            Volatile.Write(ref num, 1);
                            LogHelper.Critical($"TimeTrigger执行出现10s超时异常:{m_ids.Aggregate((i1, i2) => $"{i1}-{i2}")}");
                        }
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Warn($"定时任务出现错误{e.Message}");
                    Interlocked.Decrement(ref count);
                }
            }
            RemoveAll();
            m_timer.Change(1000 * 1, Timeout.Infinite);
        }