c# - 结束时重复调用 C# 任务
问题描述
我有一个必须并行运行代码块的 C# 应用程序。这是其中两个代码块的基本结构。实际上,还会有更多。
private async Task MyFirstTask()
{
// do stuff
await FirstTaskImplementation();
// cleanup
}
private async Task MySecondTask()
{
// do stuff
await SecondTaskImplementation();
// cleanup
}
其中一些代码块将在计时器上运行。有些会重复运行。为了完成,我有以下几点:
Task.Run(() => MyFirstTask());
Task.Run(() => MySecondTask());
完成MyFirstTask
后,我想再次运行它。事实上,我想一遍又一遍地运行它,直到程序停止。然而,我想MySecondTask
并行运行MyFirstTask
. 我的问题是,我如何MyFirstTask
重复执行,同时仍然并行MySecondTask
?
我回顾了几个相关的 SO 问题。我也没有看到Complete
一种事件处理程序。所以,就如何实现这一点而言,我有点迷茫。我感谢您的帮助!
解决方案
其美妙之async/await
处在于您可以像编写同步代码一样编写异步代码。您将如何重复同步操作?你可以使用循环。你可以在这里做同样的事情,例如:
private async Task MyFirstTask(CancellationToken token) {
while (!token.IsCancellationRequested) {
// do stuff
await FirstTaskImplementation();
// cleanup
}
}
您可以将循环嵌入到当前方法中或将其提升到包装器方法中,但它应该可以工作。
您可以像现在一样继续安排您的任务,尽管您确实应该使用await
您的async
方法:
CancellationTokenSource cts = new CancellationTokenSource();
Task.Run(async () => await MyFirstTask(cts.Token));
Task.Run(async () => await MySecondTask());
// Request cancellation via `cts` when you want the looping to end.
尽管你没有问过这个问题,但如果你想在每次迭代之间插入一个延迟,你可以简单地await Task.Delay(...)
在循环体的末尾放置一个语句。
推荐阅读
- linux - ArangoDB 大型数据库中的随机高 CPU 使用率
- c - 如何将 sin cos 函数放入此 RPN 计算器
- javascript - 将谷歌自动填充功能限制为 4 个城市
- ssas - MDX 交叉连接结果
- html - 如何使用 RSS 源为 Podcast 创建播放器?
- java - 如何仅获取用户在 numGames() 中输入的值并避免程序打印“你叫什么名字?” 再次?
- operating-system - 在没有硬件支持的情况下实现抢占式调度的实用方法?
- java - 尝试编写计算句子中单词平均长度的代码
- parameters - 如何在 squarespace 中将 UTM 参数从一页传递到另一页?
- django - 如何使用 group by 执行 django 查询,以及将两列相乘?