c#任务不能更快地工作

时间:2013-10-22 11:28:17

标签: c# task

我不知道为什么两种不同的方式几乎同时使用,或者我以错误的方式使用任务?,这是我的代码:

static void Main(string[] args)
{
    var result = new List<string>();
    var list = new List<string>();
    list.Add(string.Empty);
    list.Add(string.Empty);
    list.Add(string.Empty);
    //1st,use select
    result.AddRange(list.Select(ls=>Nothing1000000000));
    //2nd,use tasks
    result.Clear();         
    IEnumerable<Task<string>> tasks =
        list.Select(uri =>                Task<string>.Factory.StartNew(()=>Nothing1000000000));
    result.AddRange(tasks.Select(task => task.Result));
}
public static string Nothing1000000000()
{
    int result = 0;
    for (var i = 0; i < 1000000000; i++)
    {
        result += i;
    }

    return string.Empty;
}

3 个答案:

答案 0 :(得分:0)

您似乎完全错误地了解任务的作用和作用。它们不用于加速计算,所以难怪你没有看到任何性能差异。

答案 1 :(得分:0)

您正在执行单个工作单元 - 您的方法Nothing1000 ...将该工作单元从应用程序主线程移动到另一个线程并不会神奇地改变执行工作单元所需的时间。
您可能将其移出主应用程序线程的一个原因是在执行工作单元时释放该应用程序线程以执行其他操作。这可能会改善用户体验,但又不会改变工作单元的执行时间 你所追求的可能是将你的工作单元分解为N个不连续的工作单元。如果你有N个处理器或处理器核心,N个单元将比单个线程上的整个事件执行得更快 - 一个任务在每个N个处理器/核心上完成1 / N的工作。然而,有更好的方法可以像TPL中那样处理常见的变态。

答案 2 :(得分:0)

由于您的tasks LINQ查询是惰性的,因此每个任务都会在您等待之前创建(调用.Result)。

在该查询上调用ToList以立即创建所有任务。

除此之外,您的方法也会奏效。该程序将在N核盒的连续时间的大约1 / N的时间内执行。