首页 > 解决方案 > 在 ActionBlock 中使用异步 Action 而不会死锁

问题描述

我想使用 aActionBlock来异步处理通过 a 接收到的消息TcpClient。我的问题是,有时我必须等待来自其他消息的数据。如果我只是将 await 与 a 一起使用,TaskCompletionSource我会遇到死锁。例如:

TaskCompletionSource tcs = new();
ActionBlock<int> actionBlock = new(async n =>
{
    if (n == 1)
    {
        tcs.SetResult();
    }
    else
    {
        await tcs.Task;
    }
});
await actionBlock.SendAsync(0);
await Task.Delay(10);
await actionBlock.SendAsync(1);
await tcs.Task;

最后一行永远不会结束,因为第二条消息永远不会被处理。我知道,我可以增加MaxDegreeOfParallelism价值。ActionBlock但是,如果当前操作等待数据,有没有办法告诉处理下一条消息?

标签: c#asynchronoustask-parallel-librarytpl-dataflow

解决方案


推荐阅读