【问题标题】:ActionBlock misses actions sometimesActionBlock 有时会错过动作
【发布时间】:2022-01-25 12:19:48
【问题描述】:

我正在使用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
}

【问题讨论】:

标签: c# multithreading winforms tpl-dataflow


【解决方案1】:

ActionBlock 可以以并行方式执行操作(我相信在您的情况下它正是这样做的)。因此,在这种情况下,您只需在 n++ 操作上进行数据竞争。 所以,实际上ActionBlock 并没有遗漏任何东西,但是您只是错误地计算了n,有时(可能几乎所有时间)最后会得到错误的计数。

要获得n 的正确值,您可以将n++ 替换为Interlocked.Increment(ref n) 或添加lock

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多