private void ThreadManagerWork() { while (work) { try { waiter.WaitOne(TimeSpan.FromSeconds(5)); if (!work) { return; } var count = Thread.VolatileRead(ref threadsCount); if (count < NotifyServiceCfg.MaxThreads) { var messages = db.GetMessages(NotifyServiceCfg.BufferSize); if (0 < messages.Count) { var t = new Thread(SendMessages) { Priority = ThreadPriority.BelowNormal, Name = "NotifyThread " + DateTime.UtcNow.ToString("o"), IsBackground = true, }; t.Start(messages); Interlocked.Increment(ref threadsCount); waiter.Set(); log.DebugFormat("{0} started.", t.Name); } } } catch (ThreadAbortException) { return; } catch (Exception e) { log.Error(e); } } }
private async Task ThreadManagerWork() { var tasks = new List <Task>(NotifyServiceCfg.Process.MaxThreads); while (!cancellationToken.IsCancellationRequested) { try { if (tasks.Count < NotifyServiceCfg.Process.MaxThreads) { var messages = db.GetMessages(NotifyServiceCfg.Process.BufferSize); if (messages.Count > 0) { var t = new Task(() => SendMessages(messages), cancellationToken.Token, TaskCreationOptions.LongRunning); tasks.Add(t); t.Start(TaskScheduler.Default); } else { await Task.Delay(5000); } } else { await Task.WhenAny(tasks.ToArray()).ContinueWith(r => tasks.RemoveAll(a => a.IsCompleted)); } } catch (ThreadAbortException) { return; } catch (Exception e) { log.Error(e); } } }