在 ActionBlock 中使用异步 Action 不会死锁

问题描述

我想使用 ActionBlock 异步处理通过 TcpClient 接收的消息。 我的问题是,有时我必须等待来自其他消息的数据。如果我只是将 await 与 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 处理下一条消息?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)