如何重写到Task <t>以获得性能提升?</t>

时间:2014-02-03 12:15:44

标签: c# performance

我有以下代码:

    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的任务并仍然确保它的线程安全且快速?或者有更好/更快的方式吗?

2 个答案:

答案 0 :(得分:2)

我认为你只需要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
        }
    });

答案 1 :(得分:0)

使用TPL重新写这个是相对直接的

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

然而,这并没有使任何线程安全,这只是确保工作在一个单独的线程上运行。此外,它是否会更快是有争议的,你需要对它进行基准测试。