c# - 在 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
但是,如果当前操作等待数据,有没有办法告诉处理下一条消息?
解决方案
推荐阅读
- python - 如何从每个站点获取项目列表,然后从每个项目获取工作簿列表?
- c# - xpath 只选择相关节点
- javascript - JavaScript 范围链和原型
- iis - 对于应用程序池标识,当身份验证设置为匿名和 Windows 身份验证时,如何返回登录用户?
- node.js - TypeScript 错误 TS2339:“用户”类型上不存在属性“id”
- azure-cloud-shell - azure:az 资源列表缺少标签
- ide - 默认情况下如何在“变量资源管理器”上打开 Spyder
- python - 如何将新字段添加到过滤查询
- google-apps-script - 等效于 vlookup 的 javascript 函数
- pantheon - 如何将网站从 Wordpress.com(免费帐户)迁移到 Pantheon?