Разница в производительности между 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Уменьшение накладных расходов на замыкание в Task.Run/Factory.StartNew с помощью предопределенного объекта.
    Anonymous » » в форуме C#
    0 Ответы
    47 Просмотры
    Последнее сообщение Anonymous
  • Разное поведение между Factory.StartNew и Task.Run?
    Anonymous » » в форуме C#
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Многопоточный Task.factory.startnew
    Anonymous » » в форуме C#
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Многопоточный Task.Factory.StartNew вызывает утечку памяти [закрыто]
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Почему Task.Factory.StartNew для Async Lambda Work, когда на вызов Lambda напрямую нет?
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

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