public async Task StressTaskScheduling()
        {
            var logger        = new CountTasksLogger();
            var taskScheduler = new MultiThreadTaskScheduler(logger);

            taskScheduler.SetSchedulingOptions(new MultiThreadSchedulingSettings
            {
                Mode           = MultiThreadCreationMode.OneThreadPerCpuCore,
                ThreadPriority = System.Threading.ThreadPriority.BelowNormal
            });

            var numThreads = taskScheduler.SchedulingOptions.NumberOfThreads;

            var tasks         = new Task[numThreads * 50];
            int overflowCount = 0;

            // Deliberately make the work unbalanced
            int GetNumChildTasks(int i) => 1000 + (i * 800) / numThreads;

            int totalChildTasks = Enumerable.Range(0, tasks.Length).Select(GetNumChildTasks).Sum();

            for (int i = 0; i < tasks.Length; ++i)
            {
                var iCopy = i;

                // This task goes to the global queue
                tasks[i] = TaskExtensions.Unwrap(Task.Factory.StartNew(async() =>
                {
                    var subtasks = new Task <(int, int)> [GetNumChildTasks(iCopy)];
        public async Task LocallyQueuedTasks()
        {
            var logger        = new CountTasksLogger();
            var taskScheduler = new MultiThreadTaskScheduler(logger);

            taskScheduler.SetSchedulingOptions(new MultiThreadSchedulingSettings
            {
                NumberOfThreads = 4,
                ThreadPriority  = System.Threading.ThreadPriority.BelowNormal
            });

            var       tasks            = new Task[6];
            int       stolenTasksCount = 0;
            const int numChildTasks    = 50;

            for (int i = 0; i < tasks.Length; ++i)
            {
                var iCopy = i;

                tasks[i] = TaskExtensions.Unwrap(Task.Factory.StartNew(async() =>
                {
                    var random   = new Random();
                    var subtasks = new Task[numChildTasks];
                    var threadId = Environment.CurrentManagedThreadId;

                    for (int j = 0; j < subtasks.Length; ++j)
                    {
                        var jCopy   = j;
                        var delayMs = random.Next(10, 80);

                        // This child task goes to the local queue
                        subtasks[j] = Task.Factory.StartNew(() =>
                        {
                            if (Environment.CurrentManagedThreadId != threadId)
                            {
                                Interlocked.Increment(ref stolenTasksCount);
                            }

                            // Pretend to be doing work.
                            Thread.Sleep(delayMs);
                            return(iCopy, jCopy);
                        });
                    }

                    await Task.WhenAll(subtasks);
                }, CancellationToken.None, TaskCreationOptions.None, taskScheduler));
            }

            await Task.WhenAll(tasks);

            Assert.Equal(stolenTasksCount, logger.StolenTasksCount);
            Assert.Equal(tasks.Length, logger.GlobalTasksCount);
            Assert.Equal(tasks.Length * numChildTasks - stolenTasksCount, logger.LocalTasksCount);

            await taskScheduler.DisposeAsync();
        }
        public async Task TaskInterruption()
        {
            MultiThreadTaskScheduler taskScheduler = new MultiThreadTaskScheduler(14);

            bool afterDelay = false;

            await Task.Factory.StartNew(async() =>
            {
                await Task.Delay(100);
                afterDelay = true;
            },
                                        new CancellationToken(),
                                        TaskCreationOptions.DenyChildAttach,
                                        taskScheduler);

            taskScheduler.Dispose();
            await Task.Delay(200);

            Assert.False(afterDelay);
        }
        public async Task GloballyQueuedTasks()
        {
            var logger        = new CountTasksLogger();
            var taskScheduler = new MultiThreadTaskScheduler(logger);

            taskScheduler.SetSchedulingOptions(new MultiThreadSchedulingSettings
            {
                NumberOfThreads = 4,
                ThreadPriority  = System.Threading.ThreadPriority.BelowNormal
            });

            var random   = new Random();
            var subtasks = new Task <int> [300];

            for (int i = 0; i < subtasks.Length; ++i)
            {
                var delayMs = random.Next(10, 80);
                int iCopy   = i; // freeze for lambda capture
                subtasks[i] = Task.Factory.StartNew(() =>
                {
                    // Pretend to be doing work.
                    Thread.Sleep(delayMs);
                    return(iCopy);
                }, CancellationToken.None, TaskCreationOptions.None, taskScheduler);
            }

            await Task.WhenAll(subtasks);

            for (int i = 0; i < subtasks.Length; ++i)
            {
                Assert.Equal(i, subtasks[i].Result);
            }

            Assert.Equal(subtasks.Length, logger.GlobalTasksCount);

            await taskScheduler.DisposeAsync();

            Assert.InRange(logger.WorkersCount, 1, taskScheduler.SchedulingOptions.NumberOfThreads);
            Assert.Equal(logger.WorkersStopped, logger.WorkersCount);
        }
        public async Task TaskExecution()
        {
            MultiThreadTaskScheduler taskScheduler = new MultiThreadTaskScheduler(1);

            int threadId1 = -1;
            int threadId2 = -1;
            int threadId3 = -1;

            await await Task.Factory.StartNew(async() =>
            {
                threadId1 = Thread.CurrentThread.ManagedThreadId;
                await Task.Delay(10);
                threadId2 = Thread.CurrentThread.ManagedThreadId;
                await Task.Delay(10);
                threadId3 = Thread.CurrentThread.ManagedThreadId;
            },
                                              new CancellationToken(),
                                              TaskCreationOptions.DenyChildAttach,
                                              taskScheduler);

            Assert.Equal(threadId1, threadId2);
            Assert.Equal(threadId2, threadId3);
        }
Пример #6
0
        public RabbitMQDriver(string connectionString)
        {
            Dictionary <string, string> settings = connectionString.ParseConnStr();

            //creates the connection
            ConnectionFactory connectionFactory = new ConnectionFactory();

            connectionFactory.HostName    = settings["Host"];
            connectionFactory.VirtualHost = settings["VHost"];
            connectionFactory.Port        = int.Parse(settings["Port"]);
            connectionFactory.UserName    = settings["User"];
            connectionFactory.Password    = settings["Password"];
            connectionFactory.AutomaticRecoveryEnabled = true;
            _connection = connectionFactory.CreateConnection();

            //creates channels
            _requestChannel   = _connection.CreateModel();
            _notifyChannel    = _connection.CreateModel();
            _responderChannel = _connection.CreateModel();
            _responderChannel.BasicQos(0, RESPONDER_PREFETCHCOUNT, false);
            _eventHandlerChannel = _connection.CreateModel();
            _eventHandlerChannel.BasicQos(0, EVENT_HANDLER_PREFETCHCOUNT, false);
            _deadLetterQueueChannel = _connection.CreateModel();

            //application identifier
            _appId = settings["AppId"];

            //builder for container
            Injection = new ServiceCollection();

            //response queue
            _responseQueue = new MessageGroupQueue(REQUEST_TIMEOUT);

            //response listener
            EventingBasicConsumer consumer = new EventingBasicConsumer(_requestChannel);

            consumer.Received += (obj, args) =>
            {
                _responseQueue.AddMessage(Encoding.UTF8.GetString(args.Body.ToArray()), args.BasicProperties.CorrelationId);
            };

            _requestChannel.BasicConsume(DIRECT_REPLY_QUEUE, true, consumer);

            //dependency injection container
            _serviceProvider = null;

            //list of to activate consumers
            _toActivateConsumers = new List <Tuple <IModel, string, EventingBasicConsumer> >();

            //custom task schedulers
            _sendTaskScheduler            = new MultiThreadTaskScheduler(SEND_NUMBER_OF_THREADS);
            _receiveTaskScheduler         = new MultiThreadTaskScheduler(RECEIVE_NUMBER_OF_THREADS);
            _deadLetterQueueTaskScheduler = new MultiThreadTaskScheduler(DEAD_LETTER_QUEUE_NUMBER_OF_THREADS);

            //cancellation token
            _cancellationTokenSource = new CancellationTokenSource();

            //default logger
            _loggerType = typeof(DefaultLogger);

            //default tracer
            _tracerType = typeof(DefaultTracer);

            //json converter
            _jsonConverter = new JsonConverter();

            //cache handler
            _cacheHandler = new CacheHandler(CACHE_LIMIT, CACHE_DURATION);
        }
Пример #7
0
 public Logger()
 {
     _taskScheduler           = new MultiThreadTaskScheduler(NUMBER_OF_THREADS);
     _cancellationTokenSource = new CancellationTokenSource();
     _cancellationToken       = _cancellationTokenSource.Token;
 }