public Task Add(string ip, ConcurrentBag <byte[]> data)
 {
     return(Task.Run(() =>
     {
         //设置一个接收阀值
         var queueCount = datas.Count();
         if (queueCount < ReceivingThreshold)
         {
             var etwData = new EtwData
             {
                 guid = Guid.NewGuid().ToString(),
                 buffList = data,
                 enumEtwStatus = EnumEtwStatus.None,
                 time = DateTime.Now.Ticks,
                 retryCount = 0,
                 senderIp = ip,
             };
             datas.Enqueue(etwData);
         }
         else
         {
             //logger.Debug(JsonConvert.SerializeObject(
             //    $"EtwData Add more than max=[{ReceivingThreshold}]"
             //));
         }
     }));
 }
        private List <CloudflareLog> ParseEtwData(EtwData data)
        {
            List <CloudflareLog> cloudflareLogs = new List <CloudflareLog>();

            //ConcurrentBag<CloudflareLog> cloudflareLogsBag = new ConcurrentBag<CloudflareLog>();
            if (data != null)
            {
                foreach (var buff in data.buffList)
                {
                    ETWPrase eTWPrase = new ETWPrase(buff);

                    if (!parseEtwDataLog)
                    {
                        logger.Debug(JsonConvert.SerializeObject(eTWPrase));
                        parseEtwDataLog = true; //只打印一条明细ETW 日志
                    }

                    if (!IfInSuffixList(eTWPrase.Cs_uri_stem))
                    {
                        cloudflareLogs.Add(new CloudflareLog
                        {
                            ClientRequestHost   = eTWPrase.Cs_host,
                            ClientIP            = !string.IsNullOrEmpty(eTWPrase.CFConnectingIP) ? eTWPrase.CFConnectingIP : eTWPrase.C_ip,
                            ClientRequestURI    = string.IsNullOrEmpty(eTWPrase.cs_uri_query) || "-".Equals(eTWPrase.cs_uri_query) ? eTWPrase.Cs_uri_stem : $"{eTWPrase.Cs_uri_stem}?{eTWPrase.cs_uri_query}",
                            ClientRequestMethod = eTWPrase.Cs_method,
                        });
                    }
                }

                //var list = data.buffList.ToList();
                //Parallel.For(0, list.Count(), index =>
                //{
                //    var buff = list[index];
                //    ETWPrase eTWPrase = new ETWPrase(buff);
                //    cloudflareLogsBag.Add(new CloudflareLog
                //    {
                //        ClientRequestHost = eTWPrase.Cs_host,
                //        ClientIP = !string.IsNullOrEmpty(eTWPrase.CFConnectingIP) ? eTWPrase.CFConnectingIP : eTWPrase.C_ip,
                //        ClientRequestURI = string.Format("{0}?{1}", eTWPrase.Cs_uri_stem, eTWPrase.cs_uri_query),
                //        ClientRequestMethod = eTWPrase.Cs_method,
                //    });
                //});
            }
            //cloudflareLogs = cloudflareLogsBag.ToList();
            if (data != null)
            {
                data.parsedData = cloudflareLogs;
            }
            return(cloudflareLogs);
        }
        private void DoWorkOne()
        {
            EtwData data = null;

            try
            {
                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();
                //data = datas.Where(a => a.enumEtwStatus == EnumEtwStatus.None)
                //    .OrderByDescending(a => a.time).FirstOrDefault();
                datas.TryDequeue(out data);
                if (data != null)
                {
                    data.enumEtwStatus = EnumEtwStatus.Processing;
                    Analyze(data);
                    data.enumEtwStatus = EnumEtwStatus.Processed;
                    stopwatch.Stop();
                    //logger.Info(JsonConvert.SerializeObject(new
                    //{
                    //    index = data.time,
                    //    time = stopwatch.Elapsed.TotalMilliseconds
                    //}));
                }
            }
            catch (Exception e)
            {
                logger.Error(e.StackTrace); //Code review by michael, 为什么只打印堆栈不打印Message
                if (data != null)
                {
                    data.retryCount += 1;
                    if (data.retryCount > 5)
                    {
                        data.enumEtwStatus = EnumEtwStatus.Failed;
                        logger.Error(JsonConvert.SerializeObject(data));
                    }
                    else
                    {
                        data.enumEtwStatus = EnumEtwStatus.None;
                        datas.Enqueue(data);
                    }
                }
            }
        }
        private void Analyze(EtwData data)
        {
            //Stopwatch stopwatch = new Stopwatch();
            //stopwatch.Start();
            //logger.Info($"Analyze in {DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss fff")}");
            if (data != null)
            {
                //数据解析
                var cloudflareLogs = ParseEtwData(data);

                //stopwatch.Stop();
                //stopwatch.Restart();

                if (null != cloudflareLogs && cloudflareLogs.Count > 0)
                {
                    //logger.Info($"Analyze start {DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss fff")}");
                    //分析
                    var analyzeResult = AnalyzeRatelimit(cloudflareLogs);
                    if (null != analyzeResult && null != analyzeResult.result && analyzeResult.result.Count > 0)
                    {
                        //发送结果
                        SendResult(analyzeResult);
                    }
                }

                //stopwatch.Stop();

                //stopwatch.Restart();

                //logger.Info(JsonConvert.SerializeObject(new
                //{
                //    timeType = "SendResult",
                //    time = stopwatch.Elapsed.TotalMilliseconds
                //}));

                handledDatas.Add(data);
            }
        }