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

Я ответил на сообщение с многоплановым вопросом, за который проголосовали несколько раз, но теперь у меня есть второе предположение о уже существующем решении, которое работает уже много лет. Если у меня есть работа, которую нужно делать часто, но не всегда, как обработка элементов в очереди. Лучше позволить потоку спать, когда он не работает, или запускать задачу каждый раз, когда требуется обработать элемент. Основываясь на исследовании времени жизни потока, который будет являться продолжительностью работы приложения, казалось, что создание нового потока - лучший выбор. Решение задачи лучше, чем другое? Если у вас есть другая версия, которая, по вашему мнению, лучше, чем обе, решите проблему.

class DoSomething
{
  public void Enqueue(object item)
  {
    Task.Run(() => ProcessItem(item));
  }

  public void ProcessItem(object item)
  {
    //Do some work here that needs to be async from submission
  }
}

class DoSomething2
{
  public DoSomething2()
  {
    _t = new Thread(ProcessItem) { IsBackground = true };
    _t.Start();
  }
  private Thread _t;
  private ConcurrentQueue<object> _queue = new ConcurrentQueue <object>();

  public void Enqueue(object item)
  {
    _queue.Enqueue(item);
  }

  public void ProcessItem(object item)
  {

    while (true)
    {
      while (_queue.Count > 0)
      {
        //Dequeue here and do some work here that needs to be async from submission
      }
      System.Threading.Thread.Sleep(100);
    }
  }
}

Редактировать 1. Поскольку люди спрашивали, я хотел бы дать больше информации об этом. Этот класс представляет собой макет класса ведения журнала, который я создал для централизации событий для набора распределенных сервисов. Некоторые из них имеют много событий порядка миллионов, а некоторые - несколько сотен в течение дня. Есть ли одно решение, оптимальное для обоих? Я обеспокоен задачами, так как затраты на создание миллионов объектов задач перевесят огонь и забудут о выгоде.

...