using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; namespace FangYar.Common { /// /// 队列处理硬件数据信息 /// public class QueueDeviceUtil { /// /// 配置文件中线程数 /// private static string QueueDeviceThreadNumStr = System.Configuration.ConfigurationManager.AppSettings["QueueDeviceThreadNum"] + ""; /// /// 开启线程数 /// private static int QueueDeviceThreadNumNum = 0; /// /// 正常消息队列 /// public static System.Collections.Concurrent.ConcurrentQueue infoMsgQueue = new System.Collections.Concurrent.ConcurrentQueue(); /// /// 控制消息处理线程 /// private static System.Threading.Tasks.Task task; /// /// 将待处理消息添加至队列中 /// /// public static void AddDeviceDataToQueue(QueueDataMo mo) { try { if (mo != null) { //将待处理信息添加到队列 infoMsgQueue.Enqueue(mo); } //判断线程是否创建 if (task == null) { //判断开启队列数是否小于1 if (QueueDeviceThreadNumNum < 1) { //验证配置文件中队列数是否小于1 int.TryParse(QueueDeviceThreadNumStr, out QueueDeviceThreadNumNum); QueueDeviceThreadNumNum = QueueDeviceThreadNumNum < 1 ? 1 : QueueDeviceThreadNumNum; } //通过循环开启线程 for (int i = 0; i < QueueDeviceThreadNumNum; i++) { task = System.Threading.Tasks.Task.Factory.StartNew(async () => { //线程一直循环等待处理数据 while (true) { //判断是否退出线程 if (FangYar.Common.MyTaskControlHelper.TokenSource.IsCancellationRequested) { return; } // 初始化为true时执行WaitOne不阻塞 FangYar.Common.MyTaskControlHelper.ResetEvent.WaitOne(); //判断队列数据长度是否小于1 if (infoMsgQueue.Count < 1) { // 队列内无待处理数据,等待1秒后执行 await System.Threading.Tasks.Task.Delay(1000); } //处理数据 try { //从队列取出一个数并进行处理 if (infoMsgQueue.TryDequeue(out QueueDataMo dataMo)) { //判断待处理数据对象是否为空 if (dataMo != null) { //判断待处理对象执行处理方法是否为空 if (dataMo.dataFun != null) { //判断待处理数据是否为空 if (!string.IsNullOrWhiteSpace(dataMo.dataStr)) { //调用数据处理方法 dataMo.dataFun(dataMo.dataStr); //释放对象 dataMo.Dispose(); } } } } } catch (Exception ex) { string str = "队列处理数据异常:" + ex; MyLogHelper.WriteMsg(new FangYar.Common.LogInfoMo() { message = str, msgType = FangYar.Common.EnumLogMsgTypeEnum.Error, path = "QueueDevice" }); } } }); } } } catch (Exception ex) { string str = "队列添加数据异常:" + ex; MyLogHelper.WriteMsg(new FangYar.Common.LogInfoMo() { message = str, msgType = FangYar.Common.EnumLogMsgTypeEnum.Error, path = "QueueDevice" }); } } /// /// 获取硬件接口上传数据字符串 /// /// /// public static string GetHttpContextDataStr(HttpContext context) { try { HttpRequest request = context.Request; Stream stream = request.InputStream; string data = string.Empty; StreamReader streamReader = new StreamReader(stream); data = streamReader.ReadToEnd(); return data; } catch (Exception ex) { string str = "队列获取数据字符串异常:" + ex; MyLogHelper.WriteMsg(new FangYar.Common.LogInfoMo() { message = str, msgType = FangYar.Common.EnumLogMsgTypeEnum.Error, path = "QueueDevice" }); } return ""; } } /// /// 待处理数据模型 /// public class QueueDataMo : IDisposable { /// /// 待处理字符串 /// public string dataStr { get; set; } /// /// 数据处理方法 /// public DataFun dataFun { get; set; } /// /// 释放资源 /// public void Dispose() { dataStr = null; dataFun = null; GC.Collect(); } } /// /// 代理处理数据方法 /// /// public delegate string DataFun(string dataStr); }