2013-10-22 30 views
0

我不知道爲什麼兩個不同的方法採取幾乎相同的時間,或者我在錯誤的方式使用任務,這裏是我的代碼:?C#任務不工作得更快

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; 
} 
+0

因爲它們都在單線程中執行 –

回答

0

因爲您的tasks LINQ查詢是懶惰的,所以每個任務都會在您等待之前創建(調用.Result)。

在該查詢中調用ToList以立即創建所有任務。

除此之外,您的方法將工作。該程序將在N核心盒上以連續時間的大約1/N執行。

0

你似乎對於一項任務是什麼以及做什麼有一個完全錯誤的想法。他們不習慣加速計算,所以難怪你沒有看到任何性能差異。

0

您正在執行單個工作單元 - 您的方法Nothing1000 ...將該工作單元從應用程序主線程移動到另一個線程並不會奇蹟般地改變工作單元執行的時間量。
您可能將其從主應用程序線程移出的一個原因是釋放該應用程序線程以在執行單元工作時執行其他操作。這可能會改善用戶體驗,但它不會改變工作單元的執行時間。
可能你所要做的就是將你的工作單位分解成N個獨立的工作單元。如果您有N個處理器或處理器內核,N個單元的執行速度將比單個線程上的整個速度更快 - 一個任務在N個處理器/內核中的每一個上執行1/N的工作。然而,有更好的方式來處理TPL中的常見危險。