private void Stop_1() { Console.WriteLine("stop try get lock"); lock (_lock) { Console.WriteLine("stop get lock"); // Stop이 락을 먼저 잡았으니 loop가 락을 대기한다. // Stop을 잘못 구현해서 loop를 대기하게 되면 loop는 Stop의 락이 풀리기를 기다리므로 데드락이 발생한다. _naiveLoopThread.Stop(); } Console.WriteLine("stop release lock"); }
public Boolean CleanupAndWaitForAsyncSend(Int32 waitMS) { _thread?.Stop(); while (_reportActions.IsEmpty() == false) { SendReportInQueue(); } _thread = null; _reportActions = null; return(_slackWebhook.WaitForAsyncSend(waitMS)); }
internal void Stop() { lock (_lock) { if (_thread == null) { throw new LoggerException($"Fail {nameof(ThroughputController)}::{nameof(Stop)}"); } _thread.Stop(); _thread = null; Flush(); } }
internal void Stop() { lock (_lock) { if (_mainThread == null || _recordLogQueueThread == null) { throw new LoggerException($"Fail {nameof(Watcher)}::{nameof(Stop)}"); } _mainThread.Stop(); _recordLogQueueThread.Stop(); _mainThread = null; _recordLogQueueThread = null; } }
internal void Stop() { lock (_lock) { if (_thread == null) { throw new LoggerException($"Fail {nameof(CompletePutNotifier)}::{nameof(Stop)}"); } _thread.Stop(); _thread = null; } // Stop이후에 미묘한 타이밍에 Push된 것은 손실될 수 있음을 감안한다. while (_completePuts.IsEmpty() == false) { PopAndNotice(); } }