我正在使用ActionBlock并測驗它是否像下面一樣正常作業,有時會Actionblock錯過操作,它根本不應該發生
為什么會發生這種情況,我該如何解決?
var n = 0;
var action = new Action<int>((i) =>
{
n ;
//...job...
}
for (int i = 0; i < size; i )
{
var block = new ActionBlock<int>(i => action(i),
new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 6 });
n = 0;
foreach (var a in list)
block.Post(a);
block.Complete();
block.Completion.Wait();
if (n != list.Count)
ShowError(); //it's called sometimes
}
uj5u.com熱心網友回復:
ActionBlock可以以并行方式執行操作(我相信它在你的情況下正是這樣做的)。因此,在這種情況下,您只會在n 操作上進行資料競爭。所以,實際上ActionBlock并沒有遺漏任何東西,但你只是計算n不正確,有時(可能幾乎一直)在最后得到不正確的計數。
為了得到正確的值n,你可以替換n 使用Interlocked.Increment(ref n)或者只是添加lock。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/393746.html
