c# - 如果我没有完成ActionBlock会不会有问题

标签 c# async-await tpl-dataflow

我正在尝试使用操作块来执行一些任务。我的问题是什么时候CreateActionBlock()方法结束,ActionBlock仍在处理数据。由于该方法已返回并且我无法调用 actionBlock.Complete() .如果我运行这个 CreateActionBlock() 会不会引起任何问题?千次?内存中会永远有数千个 actionBlocks 还是在处理 5 个输入后会被 GC 处理?

private static async Task Dequeue(string content)
{
    Console.WriteLine("The string is " + content);
    await Task.Delay(10000);
}

public static void CreateActionBlock()
{
    var actionBlock = new ActionBlock<string>(
        (e) => Dequeue(e),
        new ExecutionDataflowBlockOptions()
        {
            BoundedCapacity = 5,
            MaxDegreeOfParallelism = 1
        });

    for (int i = 0; i < 5; i++)
    {
        actionBlock.Post(i.ToString());
    }
}

最佳答案

一旦数据流块的输入队列被清空,并且当前处于空闲状态,它就有资格进行垃圾回收。下面是一个演示此行为的示例:

var weakReference = InnerMethod();
for (int i = 1; i <= 10; i++)
{
    Thread.Sleep(100);
    GC.Collect();
    Console.WriteLine($"IsAlive: {weakReference.IsAlive}");
}

WeakReference InnerMethod()
{
    var block = new ActionBlock<int>(n =>
    {
        Thread.Sleep(200);
        Console.WriteLine($"Processed: {n}");
    });
    block.Post(1); block.Post(2); block.Post(3);
    return new WeakReference(block);
}
输出:
IsAlive: True
Processed: 1
IsAlive: True
IsAlive: True
Processed: 2
IsAlive: True
IsAlive: True
Processed: 3
IsAlive: False
IsAlive: False
IsAlive: False
IsAlive: False
IsAlive: False
( Try it on Fiddle )

关于c# - 如果我没有完成ActionBlock会不会有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66259044/

相关文章:

c# - ArgumentOutOfRangeException , IIS express on 2012 server

.net-4.5 - 异步(与非异步)函数控制流程澄清?

typescript - TypeScript 中的等待类型

task-parallel-library - 使用 PCL 'TPL Dataflow' 的项目在面向 .NET 4.5.2 时无法编译

c# - 在上传文件控件中恢复

c# - .net mvc JWT token 更改 utf-8 字符

c# - 如何拆分和合并此数据流管道?

c# - 如何以(线程)安全的方式跟踪 TPL 管道中的故障项

c# - ComboBox下拉列表隐藏

C#异步方法的使用