簡體   English   中英

為什么這些任務按順序執行?

[英]Why do these tasks execute sequentially?

為什么以下代碼按順序執行?

List<Task> tasks = new List<Task>();

for (int i = 0; i <= max; i += block)
{
    if (i + block >= max)
        tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    else
        block = max - i;
}

Task.WaitAll(tasks.ToArray());

我還使用Parallel.Invoke測試了它的一個版本; 它也不能並行執行。 肯定會有一些我不理解的東西,但是當我嘗試谷歌搜索時,我主要得到關於如何強制順序執行的說明。

作為對以下答案中給出的警告之一的回應,我已經包括以下方法供參考:

static void Count(ref int counter, int num)
{
    int localCounter = 0;
    for (int i = 0; i < num; i++)
        if (Coin()) localCounter++;
    System.Threading.Interlocked.Add(ref counter, localCounter);
}

再次編輯:謝謝大家!

只需替換tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block))); 使用Console.WriteLine並調試代碼。

您永遠不會創建多個任務。

for (int i = 0; i <= max; i += block)
{
    if (i + block >= max)
        Console.WriteLine(i);
    else
        block = max - i;

}

為什么以下代碼按順序執行?

它不會,除非您在Count方法中有某些內容正在同步對單個資源的訪問。 如果它可以並行化,那么這將並行運行。

如果Count執行得非常快,那么你會發現任務的完成速度比新任務的安排要快,這就是為什么它們都可以按順序執行。

在我看來你的loop / if語句有問題:

for (int i = 0; i <= max; i += block)
{
    if (i + block >= max)
        tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    else
        block = max - i;
}

如果我正確讀取它,你只會在i + block >= max添加一個任務,並且只有當i + block <= max時才會循環(顯示計數器增加和條件檢查)。 因此,您只需添加一次任務。

此外,當您不添加任務時,您正在更改阻止。 我希望你想要更像下面這樣的東西,但我不能確定沒有更多的代碼:

for (int i = 0; i <= max; i += block)
{
    tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    if (i + block >= max) { block = max - i; }
}

暫無
暫無

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

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