/// <summary> /// 线程监控,停止自动启动 /// </summary> private static void ThreadMonitor() { while (true) { Thread.Sleep(10000); try { var r = ThreadInfos.Count(a => a.Thread != null && a.Thread.IsAlive); var e = ThreadInfos.Count(a => a.Thread == null || !a.Thread.IsAlive); if (e > 0) { var es = ThreadInfos.Where(a => a.Thread == null || !a.Thread.IsAlive).ToArray(); var errThreadNames = es.Select(a => a.ThreadName).ToArray(); Log.Warn(string.Format("线程共{0}个,正常{1}个,异常{2}个,异常线程:{3}", ThreadInfos.Count, r, e, StrHelper.Join(errThreadNames, ","))); Log.Warn(string.Format("正在重启线程{0}", StrHelper.Join(errThreadNames, ","))); foreach (var thread in es) { var ti = ThreadInfos[ThreadInfos.FindIndex(a => a == thread)]; if (ti.IsParameterized) { ti.Thread = new Thread(p => { while (true) { try { ti.ParameterizedThreadStart(p); Log.Monitor(string.Format("线程{0}({1})执行正常", ti.ThreadName, p)); } catch (Exception ex) { Log.Error(string.Format("线程{0}({1})执行异常:{2} {3}", ti.ThreadName, p, ex.Message, ex.StackTrace)); } if (ti.WaitSeconds > 0) { Thread.Sleep(1000 * ti.WaitSeconds); } else { break; } } }); ti.Thread.Start(ti.Parameter); } else { ti.Thread = new Thread(() => { while (true) { try { ti.ThreadStart(); Log.Info(string.Format("线程{0}执行正常", ti.ThreadName)); } catch (Exception ex) { Log.Error(string.Format("线程{0}执行异常:{1} {2}", ti.ThreadName, ex.Message, ex.StackTrace)); } if (ti.WaitSeconds > 0) { Thread.Sleep(1000 * ti.WaitSeconds); } else { break; } } }); ti.Thread.Start(); } Thread.Sleep(1000); } } } catch (Exception e) { Log.Error(e.Message + e.StackTrace); } } }
/// <summary> /// 转换为用分隔符连接的字符串 /// </summary> /// <typeparam name="T">集合元素类型</typeparam> /// <param name="list">集合</param> /// <param name="quotes">引号,默认不带引号,范例:单引号"'"</param> /// <param name="separator">分隔符,默认使用逗号分隔</param> /// <returns></returns> public static string Join <T>(this IEnumerable <T> list, string quotes = "", string separator = ",") { return(StrHelper.Join(list, quotes, separator)); }