0

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

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;
}
4

3 回答 3

0

您似乎对任务是什么以及做什么有一个完全错误的想法。它们不用于加快计算速度,因此难怪您没有看到任何性能差异。

于 2013-10-22T11:33:18.990 回答
0

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

于 2013-10-24T11:07:38.227 回答
0

因为您的tasksLINQ 查询是惰性的,所以每个任务都会在您等待它之前创建(调用.Result)。

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

除此之外,您的方法将起作用。该程序将在 N 核机器上以大约 1/N 的顺序时间执行。

于 2013-10-24T11:22:19.170 回答