[英]Will it be a problem if I do not complete an ActionBlock
我正在嘗試使用操作塊來執行一些任務。 我的問題是當CreateActionBlock()
方法完成時, ActionBlock
仍在處理數據。 由於該方法被返回並且我沒有辦法調用actionBlock.Complete()
。 如果我運行這個CreateActionBlock()
千次會導致任何問題嗎? memory 中是否會永遠存在數千個 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());
}
}
一旦數據流塊的輸入隊列被清空並且當前處於空閑狀態,它就有資格進行垃圾回收。 以下是演示此行為的示例:
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);
}
Output:
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
(在小提琴上試試)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.