我应该为此用例使用任务或线程吗?

时间:2014-02-26 03:23:31

标签: c# .net multithreading

我仍然掌握.NET 4多线程库的处理方式,因此我不确定它们是否比较低级别的解决方案更有用。

我有一个消息的BlockingCollection需要发送到某个HTTP服务端点。通常我的解决方案是创建一个无限循环函数,如此

void DoWork()
{
    while(true)
    {
        var message = collection.Take();
        SendMessage();
    }
}

启动X个Thread()对象来处理循环。多个线程占用等待HTTP响应所花费的时间,然后我将分析和调整性能以确定要使用的正确线程数。

这更适合任务吗?

3 个答案:

答案 0 :(得分:2)

在这种情况下使用Task或Thread时没有太大区别。两者都会做同样的事情。

我宁愿使用GetConsumingEnumerable来写这个,以便在没有元素的情况下它就会消失。

void DoWork()
{
    foreach(var message in collection.GetConsumingEnumerable())
    {
        SendMessage();
    }
}

答案 1 :(得分:0)

我不打算就你应该使用哪个提出我的意见,但我会提供一些指导。

这篇文章:https://stackoverflow.com/a/4130204/3317555提供了一些非常好的指导。由于您正熟悉.NET 4,因此您可能希望尝试这两种方式,并在功能方面以及它在代码中的外观方面更好地了解您喜欢哪种风格。

编辑:我会这样说,使用Parallel。

答案 2 :(得分:0)

从MSDN开始 - “从.NET Framework 4开始,TPL是编写多线程和并行代码的首选方式。”

http://msdn.microsoft.com/en-us/library/dd460717.aspx

我发现Parallel.ForEach()擅长此类任务。它优化了线程数。它考虑了系统中核心的数量以及线程正在做的事情。