Задание выполняется через несколько секунд после вызова - PullRequest
0 голосов
/ 31 мая 2018

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

public void ReceiveMessage(string Message) {
      Logger.Logger.Log($"Receive Message {Message} in METHOD method");  
      //see in the log time stamp 12:13:51.000
                Task.Factory.StartNew(() =>
                {
                    Logger.Logger.Log($"Receive Message  {Message} in TASK method"); 
                    //see in the log time stamp 112:13:53.000

                    processMessage(Message);
                });
}

private void processMessage(string message) {
     //do some processing job
}

.много сообщений, полученных в сервисе от разных клиентов, каждое сообщение отправляется в другой экземпляр, ReceiveMessage и processMessage - это методы для экземпляра Таким образом, между вызовом метода и запуском запускается 2 секундызадача - кто-нибудь знает, почему это могло произойти и как этого избежать?

Я думал, что C # может управлять своими собственными пулами потоков ...

1 Ответ

0 голосов
/ 31 мая 2018

Существует ограниченное число задач, которые могут выполняться одновременно, проверьте свойство Task.Factory.Scheduler.MaximumConcurrencyLevel

Планировщик по умолчанию для библиотеки параллельных задач и PLINQ использует пул потоков .NET Framework, которыйпредставлен классом ThreadPool для постановки в очередь и выполнения работы.Пул потоков использует информацию, предоставляемую типом Task, для эффективной поддержки детального параллелизма (недолговечных единиц работы), который часто представляют параллельные задачи и запросы.

Однако ThreadPool Размер пула зависит от нескольких факторов:

Для каждого процесса существует один пул потоков.Начиная с .NET Framework 4, размер пула потоков по умолчанию для процесса зависит от нескольких факторов, таких как размер виртуального адресного пространства.Процесс может вызвать метод GetMaxThreads, чтобы определить количество потоков.Количество потоков в пуле потоков можно изменить с помощью метода SetMaxThreads.Каждый поток использует размер стека по умолчанию и работает с приоритетом по умолчанию.

TheadPool - https://msdn.microsoft.com/en-gb/library/system.threading.threadpool.aspx

...