public void Start(out string errMsg) { errMsg = ""; if (IsRuning) { return; } // 加载日志数据发布服务所需配置文件信息 this.mqttParam = new MQTTParam(); if (!LoadConfig(out errMsg)) { return; } // 检查端口是否空闲 if (!IPTool.IsValidPort(this.mqttParam.port)) { errMsg = "日志服务器的发布端口被占用,请更换端口号"; return; } // 开启MQTT服务当做发布器 mqttServer = new MQTTServer(mqttParam); mqttServer.Start(out errMsg); if (!mqttServer.IsRuning || !string.IsNullOrWhiteSpace(errMsg)) { Stop(); return; } // 开启消息队列的消费器 queue = new BlockingCollection <TraceItem>(); task = new Task(() => { foreach (TraceItem item in queue.GetConsumingEnumerable()) { try { ActionTimeout <TraceItem> timeout = new ActionTimeout <TraceItem>(); timeout.Do = Excute; bool isTimeout = timeout.DoWithTimeout(item, TimeSpan.FromSeconds(5)); //只等待5秒 if (isTimeout) // 超时 { GC.Collect(); } } catch { } } }, TaskCreationOptions.LongRunning); task.Start(); IsRuning = true; }
public void Stop() { // 关闭消息队列的消费器 // 先完成添加 queue.CompleteAdding(); DateTime time1 = DateTime.Now; while (queue.Count > 0) { Thread.Sleep(1); // 最多等待10秒避免关不掉 if (DateTime.Now - time1 > TimeSpan.FromSeconds(10)) { break; } } while (queue.Count > 0) { // 等了十秒还没听,队列全部元素废弃 queue.Take(); } queue = null; Task.WaitAll(task); task.Dispose(); task = null; // 关闭发布器 if (mqttServer != null) { mqttServer.Stop(); mqttServer = null; } IsRuning = false; }