c# - 启动/停止“服务”任务的类的异步/等待版本是什么?
问题描述
在较旧的 C# 中,我们可能会遇到这样的代码,它允许您启动/停止一个任务(实际上是一个线程),它像后台工作线程一样连续运行......可能为队列或其他服务提供服务:
class ServiceTask
{
private Task task;
private CancellationTokenSource cancellation = new CancellationTokenSource();
public void Start()
{
task = Task.Run(() => TaskLoop(),cancellation.Token);
}
public void Stop()
{
cancellation.Cancel();
task.Wait();
}
private void TaskLoop()
{
while(!cancellation.Token.IsCancellationRequested)
{ ... }
}
为粗略的例子道歉,但我的疑问是,现代的 async/await 等价物会是什么样子?await
是否像对任务进行 -ing 而不是-ing一样简单Wait
?
(澄清一下:在我的示例中,这可能看起来像一个实际的服务,但我的问题是关于这个代码模式……完整的真实代码太大太复杂,无法发布所有细节)
解决方案
Async/Await 和 Start/Stop 可能看起来相似,但它们具有不同的语义。
带有 async/await 的任务旨在表示一个自行完成的任务。主要的工作流程是它在创建时开始并自行完成。取消机制不是主要流程。
Start/Stop 具有不同的语义,因为它永远不会自行结束。它将继续运行,直到调用 Stop 为止。虽然它可以自行停止,但主要流程是它将无限期地运行。
综上所述,我可以得出结论,Task/async/await 和 start/stop 语义在现代 C# 世界中都占有一席之地。它们都处理不同的操作模式。只是任务更可见、更常用,因为它们的用例更常见。
推荐阅读
- wordpress - WordPress 没有禁用自动断字
- r - 无法理解“Rstudio pdf knit 失败并出现 'Environment Shaded undefined' 错误”
- angular - 如何使用 Angular 动画进行无限旋转?
- .net - 在 Wpf 中,如何等待所有后代完成清理?
- python - Django如何在一个视图中呈现抽象模型类的子类
- angularjs - 更新令牌在 adal.js v1.0.14 中不起作用
- angular - 已记录但未触发的操作
- elasticsearch - 将 Elasticsearch Watcher 限制为一个警报
- vba - VBA为“行列表”中的文本着色
- c# - 如何在 xaml 中集成一个简单的 ContentDialog?(C#)