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也可以正常工作,但您的程序不知道何时可以安全退出。因此,从一个非常广泛的角度来看,火灾和遗忘意味着你可以接受失去工作。大多数程序都不适合。但是如果你对程序退出时失去工作没问题,那么这就行了。