【问题标题】:How to rewrite to Task<T> for performance gain?如何重写 Task<T> 以获得性能提升?
【发布时间】:2014-02-03 12:15:44
【问题描述】:

我有以下代码:

    static BlockingCollection<SimpleObject> sendQueue = new BlockingCollection<SimpleObject>();

    static public void Insert(string key, T value)
    {
        SimpleObject simpleObject = new SimpleObject {Key = key, Value = value};
        sendQueue.Add(simpleObject);
        var data = sendQueue.Take(); //this blocks if there are no items in the queue.

        ThreadPool.QueueUserWorkItem(state =>
        {
            //Do ASYNC stuff with data here - threadsafe
        });
    }

我怎样才能写这个来使用 T 的 Task 并且仍然确保它是线程安全的和快速的?还是有更好/更快的方法?

【问题讨论】:

  • 您当前的实现如何使其线程安全?
  • @mch_dk 这是真正的代码,所以你插入然后立即取出一个项目?

标签: c# performance


【解决方案1】:

我认为您只需要 2 个线程/任务。 1 个生产者和 1 个消费者。

//Producer
Task.Factory.StartNew(() =>
    {
        for(int i=0;i<100000000;i++)
        {
            sendQueue.Add(new SimpleObject() { Key = "", Value = "" });
        }
        sendQueue.CompleteAdding();
    });

//Consumer
Task.Factory.StartNew(() =>
    {
        foreach(var so in sendQueue.GetConsumingEnumerable())
        {
            //do something
        }
    });

【讨论】:

    【解决方案2】:

    使用 TPL 重写此代码相对简单

    Task.Factory.StartNew(() => {
        // do async stuff
    });
    

    但是,这并没有使任何线程安全,这只是确保工作在单独的线程上运行。此外,它是否会更快还有待商榷,您需要对其进行基准测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-06
      • 2011-07-17
      • 2015-06-02
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      相关资源
      最近更新 更多