让线程进入睡眠状态或在Task上运行

时间:2018-11-02 16:52:07

标签: c# multithreading task

我在一个帖子中回答了一个被多次否决的线程问题,但是现在我不得不第二次猜测已经运行了多年的解决方案。如果我有一些需要经常但不总是像队列中的处理元素那样完成的工作。最好是在不工作时让线程休眠,或者在每次需要处理元素时启动任务。基于对线程生存期的研究(这可能是应用程序的运行时间),似乎创建一个新线程是更好的选择。任务解决方案是否比其他解决方案更好?如果您认为自己的版本比这两个版本都更好,请随时提交。

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.既然有人问过我想提供更多有关它的信息。此类是我创建的用于集中一组分布式服务的事件的日志记录类的模型。有些事件发生的事件数以百万计,而有些事件可能一天发生数百次。有没有一种解决方案对两者都最佳。我对Tasks的关注是,创建数百万个任务对象的开销将超过成本,而忘记收益。

0 个答案:

没有答案