Ejemplo n.º 1
0
        private void PopAndNotice()
        {
            var completePuts = new List <CompletePutNotice>(_completePuts.Count);

            while (_completePuts.IsEmpty() == false)
            {
                CompletePutNotice completePutNotice = _completePuts.Pop();
                if (completePutNotice.CompletePutNoticeResultType == CompletePutNoticeResultType.Success)
                {
                    if (_completePutNoticeType == CompletePutNoticeType.Both ||
                        _completePutNoticeType == CompletePutNoticeType.SuccessOnly)
                    {
                        completePuts.Add(completePutNotice);
                    }
                }
                else
                {
                    if (_completePutNoticeType == CompletePutNoticeType.Both ||
                        _completePutNoticeType == CompletePutNoticeType.FailOnly)
                    {
                        completePuts.Add(completePutNotice);
                    }
                }
            }

            if (0 < completePuts.Count)
            {
                // 알림을 받는 쪽과 이곳의 분리를 위해 스레드 풀을 이용한다.
                ThreadPool.QueueUserWorkItem(_ => _noticeCompletePut?.Invoke(completePuts));
            }
        }
Ejemplo n.º 2
0
 private void SendReportInQueue()
 {
     // 큐를 비울 때까지 연속으로 보내면, Sync라 할지라도 순서가 뒤바뀔 가능성이 높아서 하나씩 보낸다.
     // 초당 1000/THREAD_INTERVAL_MS 개의 제한이 생긴다.
     if (_reportActions?.IsEmpty() == false)
     {
         _reportActions?.Pop()();
     }
 }
Ejemplo n.º 3
0
        private void Flush()
        {
            while (true)
            {
                PutLog putLog = _putLogs.Pop();
                if (putLog == null)
                {
                    break;
                }

                Put(putLog);
            }

            foreach (PutLog reservedPutLog in _remainPutLogs)
            {
                Put(reservedPutLog);
            }

            _remainPutLogs.Clear();
        }