c# - CancellationTokenSource 在 TaskCompletionSource 上未按预期工作
问题描述
我正在尝试使用 TaskCompletionSource 将基于事件的调用包装到任务上,但由于某种原因,这无法按预期工作,当调用 SendRequest 时,await SendRequest(cmdid, data)
无论我如何尝试 SetCanceled、SetResult 等,它都不会返回...
为了确保任务在进一步排除故障之前结束,下面我正在尝试使用 CancellationTokenSource,它似乎没有按预期工作,我是否误解了 TaskCompletionSource 和 Cancellation 的概念和用法?
我的理解是,当附加到 tcs 的取消令牌将在 1 秒后过期时,以下代码将引发异常,但不会,await SendRequest(cmdid, data)
永远阻塞。
public async Task<object> SendRequest(CmdId cmdID, object data)
{
CancellationTokenSource source = new CancellationTokenSource(1000);
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>(source.Token);
Request(cmdID, seqNr, data);
return await tcs.Task;
}
我在这里先向您的帮助表示感谢。
解决方案
这种用法:
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>(source.Token);
只需设置AsyncState
任务的。它与取消无关,并且不会自动挂钩。如果你想让取消做某事,你需要使用Register
取消令牌上的方法,并实际触发 TCS 被取消。
推荐阅读
- oracle - 添加外键约束时出现“ORA-00904 无效标识符”
- android - 在 React Native 中进行生产构建后,AAB 文件比 IPA 文件大
- mysql - 服务器字符集的问题导致 phpMyAdmin 显示“未定义偏移量”的通知
- python - 无法改进文档图像的掩码 RCNN 模型?
- python - 如何使另一个 python 脚本可以读取 .py 脚本?
- python - Python BeautifulSoup 从父/兄弟关系中获取内容
- python - 如何仅在python中的某个块内读取HTML文件?
- regex - 正则表达式:匹配两个关键字之间的字符串与多行无用数据混合
- java - 显示输出后如何在我的数组中搜索元素?
- python - 将列动态添加到 pyplot 不起作用