簡體   English   中英

C#任務無法更快地工作

[英]c# task does not work any faster

我不知道為什么兩種不同的方式幾乎需要相同的時間,或者我以錯誤的方式使用任務?這是我的代碼:

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

您似乎對任務的含義和任務有完全錯誤的認識。 它們不用於加快計算速度,因此也就不足為奇了。

您正在執行一個工作單元-方法Nothing1000 ...將工作單元從應用程序主線程移動到另一個線程並不會神奇地改變工作單元執行的時間。
您可能將其從主應用程序線程中移出的一個原因是,在工作單元正在執行時,釋放該應用程序線程以執行其他操作。 這可能會改善用戶體驗,但同樣不會改變工作單元的執行時間。
您可能要做的就是將工作單元分解為N個離散的工作單元。 如果您有N個處理器或處理器核心,那么N個單元的執行速度將比單個線程上的整體執行速度更快-一個Task在N個處理器/核心中的每一個上執行1 / N的工作。 但是,還有更好的方法來處理TPL中的常見問題。

由於您的tasks LINQ查詢是惰性的,因此每個任務都會在您等待它之前創建(調用.Result )。

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

除此之外,您的方法將行得通。 該程序將在N核盒上以順序時間的大約1 / N執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM