2016-10-27 4 views
1

В моем приложении я получаю сообщения и вызванное событие. Событие определяется в библиотеке, поэтому я могу только подписаться.Управление задачами в .NET

consumer.Received += (model, ea) => new Task(() => 
{ 
    var body = ea.Body; 
    var message = Encoding.UTF8.GetString(body); 
    Console.WriteLine(message); 
}).Start(); 

Я запускаю новую задачу, когда сообщение получено. Но это может быть очень большое количество сообщений и выполняемая задача. Я думаю, когда я буду использовать новый Task().Start(), он начнется сразу, поэтому моя система может перегрузиться. Возникает вопрос: как управлять задачами, не создавая контейнеры с фиксированным количеством запущенных задач, потому что я хочу использовать максимум возможностей и доверительное управление для .NET. Благодарю.

ответ

1

Здесь задачи ставятся в очередь на пул потоков и выполняются на основе его эвристики.

доверительное управление для .NET

Да ... среда выполнения имеет ограниченную информацию о том, что планирование задач является оптимальным. Иногда вам нужно взять под контроль. В частности, если вы выполняете IO. У меня меньше опыта с рабочими нагрузками с ограниченным процессором, но они должны быть более корректными с планированием по умолчанию.

Трудно рекомендовать что-то конкретное, так как неясно, насколько типичным является пример кода вашей фактической рабочей нагрузки. Если это основано на IO, вы определенно не должны полагаться на эвристику пула потоков. TPL не знает, что могут сделать ваши устройства ввода-вывода.

Здесь, поскольку вы не используете async IO (в примере кода), вы можете использовать абстракцию TaskScheduler для создания планировщика задач с ограниченной степенью параллелизма, если вы хотите взять под свой контроль.

Возможно, вам лучше всего провести тестирование реальной рабочей нагрузки. Если вы обнаружите, что создается слишком много потоков, вы можете ограничить степень параллелизма значащим значением.