C# 如果我没有完成ActionBlock会有问题吗

C# 如果我没有完成ActionBlock会有问题吗,c#,async-await,tpl-dataflow,C#,Async Await,Tpl Dataflow,我正在尝试使用动作块来执行一些任务。我的问题是当CreateActionBlock()方法完成时,ActionBlock仍在处理数据。因为该方法已返回,我无法调用actionBlock.Complete()。如果我运行此CreateActionBlock()1000次,是否会导致任何问题?内存中会永远有上千个ActionBlock吗?还是在处理了5个输入后会对它们进行GC private static async Task Dequeue(string content) { Consol

我正在尝试使用动作块来执行一些任务。我的问题是当
CreateActionBlock()
方法完成时,
ActionBlock
仍在处理数据。因为该方法已返回,我无法调用
actionBlock.Complete()
。如果我运行此
CreateActionBlock()
1000次,是否会导致任何问题?内存中会永远有上千个ActionBlock吗?还是在处理了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());
    }
}
私有静态异步任务出列(字符串内容)
{
Console.WriteLine(“字符串为”+内容);
等待任务。延迟(10000);
}
公共静态void CreateActionBlock()
{
var actionBlock=新actionBlock(
(e) =>出列(e),
新的ExecutionDataflowBlockOptions()
{
边界容量=5,
MaxDegreeOfParallelism=1
});
对于(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);
}
()

有些关联:“它会引起任何问题”的答案可能是肯定的。动作块可以正常工作,GC也可以正常工作,但您的程序不知道何时可以安全退出。因此,从一个非常广泛的角度来看,火灾和遗忘意味着你可以接受失去工作。大多数程序都不适合。但是如果你对程序退出时失去工作没问题,那么这就行了。