C#: ожидайте TransformBlock. Завершение без ответа - PullRequest
0 голосов
/ 11 марта 2020

У меня есть это:

public static async Task Main(string[] args)
{
    try
    {
        var block = new TransformBlock<int, int>(x =>
        {
            if (x == 1)
            {
                throw new Exception("transform");
            }
            return x * 2;
        });

        var outputBlock = new ActionBlock<int>(Console.WriteLine);
        block.LinkTo(outputBlock, new DataflowLinkOptions { PropagateCompletion = true });
        block.Post(4);
        await block.Completion;
    }
    catch(Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

Он бежит к линии «жду» и останавливается, кажется, он зависает. Я думаю, что я уже указал «LinkTo» для потребителя для блока и назвал «Post» для подачи ввода. Почему завершение не заканчивается?

Как это исправить?

1 Ответ

1 голос
/ 12 марта 2020
public static async Task Main(string[] args)
{
    try
    {
        var block = new TransformBlock<int, int>(x =>
        {
            if (x == 1)
            {
                throw new Exception("transform");
            }
            return x * 2;
        });

        var outputBlock = new ActionBlock<int>(Console.WriteLine);
        block.LinkTo(outputBlock, new DataflowLinkOptions { PropagateCompletion = true });
        block.Post(4);
        block.Complete();
        await block.Completion;
    }
    catch(Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

Для выполнения операции Post требуется дополнительный вызов метода Complete в ActionBlock.

Вы также можете посмотреть исходный код здесь .

...