Beispiel #1
0
        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);
                }
            }
        }
Beispiel #2
0
        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);
                }
            }
        }