簡體   English   中英

如果我沒有完成一個 ActionBlock 會不會有問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM