BeginInvoke
метод отправляет фактическую работу в пул потоков, как написано в этой статье .На самом деле это может занять некоторое время, когда нет доступных свободных потоков.Пул потоков может решить подождать завершения некоторых рабочих элементов или добавить дополнительные потоки с учетом минимальных и максимальных ограничений.
Некоторая дополнительная информация может быть найдена здесь Управляемый пул потоков и там Простое описание рабочих потоков и потоков ввода-вывода в сети , а также в разделе замечаний этой статьи ThreadPool.SetMinThreads .
Вы должны знать, что один и тот же пул потоков используется для обработки HTTP-запросов, поэтому обычно бессмысленно выгружать пользовательскую работу без привязки к IO в пул потоков в веб-приложениях,поскольку это не даст вам никаких преимуществ и может даже снизить производительность из-за дополнительных переключателей потоков.Хотя BeginInvoke
не выглядит как вызов асинхронной операции ввода-вывода.
На самом деле не имеет значения, какой конкретный поток выполняет работу - клиент все равно должен ждать ответа столько же времени.Похоже, что вы, возможно, выиграете некоторое время, выполняя работу параллельно, но под нагрузкой это будет невозможно, поскольку в пуле потоков не будет доступных потоков для обработки как HTTP-запросов, так и ваших пользовательских рабочих элементов.
Возможно, вы захотите проверить эту тему для получения дополнительной информации по этой теме.Это связано с Task
, но это не имеет значения, поскольку оба BeginInvoke
и Task.Run
используют один и тот же пул потоков под капотом.