Home > database >  ActionBlock misses actions sometimes
ActionBlock misses actions sometimes

Time:12-25

I'm using ActionBlock and I tested if it's working properly like below and sometime Actionblock misses actions and it shouldn't happen at all

Why is this happening and how can i fix it?

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
}

CodePudding user response:

ActionBlock can execute operations in parallel manner (and I believe it does exactly this in your case). So, in this case you just have a data race on n operation. So, actually the ActionBlock does not miss anything, but you just calculating n incorrectly and sometimes (may be almost all the time) get incorrect count at the end.

To get correct value of n you may replace n with Interlocked.Increment(ref n) or just add a lock.

  • Related