private async Task schedule() { Task continueTask = null; if (Interlocked.CompareExchange(ref isHandling, 1, 0) == 1) { return; } try { if (await handler.ProcessData(this)) { if (buffer.Count > 0) { processCount++; continueTask = new Task(async() => await schedule()); } else { processCount = 0; } if (processCount > 100) { throw new Exception("max process count in handler"); } } } catch (Exception ex) { Logger.Log("from schedule: " + ex.Message); Console.WriteLine("from schedule: " + ex.Message); continueTask = null; closeConnection(); } finally { Interlocked.Decrement(ref isHandling); if (continueTask != null) { continueTask.Start(); } } }