c# - 我可以保证已经运行了可运行的任务延续吗?
问题描述
这是我正在处理的一段代码中显着减少的测试用例:
var i = 0;
var taskCompletionSource = new TaskCompletionSource<object>();
var task = taskCompletionSource.Task;
Task.Run(async () =>
{
await task;
i = 1;
});
// Synchronously complete `task`
taskCompletionSource.SetResult(null);
// ???
Console.WriteLine(i);
假设这段代码在async
方法的上下文中运行,应该替换什么// ???
来确保这段代码打印1
而不是0
?
我相信我理解为什么编写的程序总是会打印0
——代码是同步执行的,调度程序没有任何结果。但我很惊讶地得知
await Task.Yield();
还不够。有点讽刺的是(但完全可以理解,因为它不涉及异步执行)
await task;
另一方面,
await Task.Delay(1);
似乎确实足够了,但我不清楚这是保证还是时间上的意外。
以另一种方式问这个问题:我可以编写任何(合理的)代码来保证在继续task
之前运行所有的延续吗?
解决方案
我可以保证已经运行了可运行的任务延续吗?
通过await
ing 他们。
var i = 0;
var taskCompletionSource = new TaskCompletionSource<object>();
var task = taskCompletionSource.Task;
var continuation = Task.Run(async () =>
{
await task;
i = 1;
});
// Synchronously complete `task`
taskCompletionSource.SetResult(null);
// wait for the continuation
await continuation;
// ouputs 1
Console.WriteLine(i);
如果您使用的是异步方法,那将有效。如果不是,请使其异步。您也可以在技术上阻止(.Wait()
而不是await
),但这会导致死锁,所以要小心。
推荐阅读
- node.js - 使用 element.download 下载文件后缺少 ASCII 标记“DC3”
- javascript - django模板中的传单动态地图生成
- c++ - 如何为特定于类的 typedef (c++17) 启用自动类型推断?
- node.js - NodeJS 持久化用户输入的表单值
- node.js - ffmpeg 中的 URL(fs.createStreamReader(url))
- tableau-api - 如何检查已发布数据源中的哪些字段在 Tableau Server 中的不同工作簿中使用?
- apache-flink - org.apache.flink.streaming.runtime.tasks.AsynchronousException:处理计时器时捕获异常
- redis - springboot 使用 lua 创建 redis 布隆过滤器:@user_script:1: ERR bad error rate
- flutter - 如何将联系人导入我的颤振短信发件人应用程序?
- asynchronous - context.job_queue.run_once 在 Python Telegram BOT API 中不起作用