![](/img/trans.png)
[英]Why does ContinueWith appear to be blocking and / or running tasks sequentially
[英]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.