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)); } }
private void SendReportInQueue() { // 큐를 비울 때까지 연속으로 보내면, Sync라 할지라도 순서가 뒤바뀔 가능성이 높아서 하나씩 보낸다. // 초당 1000/THREAD_INTERVAL_MS 개의 제한이 생긴다. if (_reportActions?.IsEmpty() == false) { _reportActions?.Pop()(); } }
private void Flush() { while (true) { PutLog putLog = _putLogs.Pop(); if (putLog == null) { break; } Put(putLog); } foreach (PutLog reservedPutLog in _remainPutLogs) { Put(reservedPutLog); } _remainPutLogs.Clear(); }