Разница в производительности между ThreadPool.QueueUserWorkItem и Task.Factory.StartNewC#

Место общения программистов C#
Anonymous
Разница в производительности между ThreadPool.QueueUserWorkItem и Task.Factory.StartNew

Сообщение Anonymous »

У меня есть база кода, использующая ThreadPool.QueueUserWorkItem в нескольких местах. Я подумал, что было бы неплохо переключиться с использования ThreadPool.QueueUserWorkItem на использование Task.Factory.StartNew с TaskScheduler.Default в качестве планировщика.

После обновления я увидел заоблачное время выполнения приложения. Это транснациональное онлайн-приложение, которое получает запросы и обычно отвечает в период от 40 мс до 500 мс, что является приемлемым. После перехода на способ задач я вижу, что ответ многих транзакций занимает от 4000 мс до даже 38 000 мс, что неприемлемо.

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

Все действия по ведению журнала были инициированы в ThreadPool с помощью

Код: Выделить всё

ThreadPool.QueueUserWorkItem(/*logging action*/)
Действие по проверке качества было инициировано

Код: Выделить всё

Task.Factory.StartNew(/*qc action*/,
TaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness)
После применения изменений
Действия по ведению журнала были переключены на

Код: Выделить всё

Task.Factory.StartNew(/*logging action*/,
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default)
И действие проверки качества переключилось на

Код: Выделить всё

Task.Factory.StartNew(/*qc action*/,
CancellationToken.None,
TaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness,
TaskScheduler.Default)
Существует ли вероятность того, что действия регистрации приостанавливают действие проверки качества при выполнении с помощью Task.Factory.StartNew в ThreadPoolScheduler (TaskScheduler.Default), но при выполнении непосредственно в ThreadPool с QueueUserWorkItem, они этого не делают?

Существует ли вероятность того, что флаг TaskCreationOptions.PreferFairness в действии проверки качества заставит проверку качества ждать протоколировать действия, даже если этот флаг не установлен при их инициировании?

Подробнее здесь: https://stackoverflow.com/questions/368 ... actory-sta

Вернуться в «C#»