首页 > 解决方案 > 启动/停止“服务”任务的类的异步/等待版本是什么?

问题描述

在较旧的 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

(澄清一下:在我的示例中,这可能看起来像一个实际的服务,但我的问题是关于这个代码模式……完整的真实代码太大太复杂,无法发布所有细节)

标签: c#task-parallel-library

解决方案


Async/Await 和 Start/Stop 可能看起来相似,但它们具有不同的语义。

带有 async/await 的任务旨在表示一个自行完成的任务。主要的工作流程是它在创建时开始并自行完成。取消机制不是主要流程。

Start/Stop 具有不同的语义,因为它永远不会自行结束。它将继续运行,直到调用 Stop 为止。虽然它可以自行停止,但主要流程是它将无限期地运行。

综上所述,我可以得出结论,Task/async/await 和 start/stop 语义在现代 C# 世界中都占有一席之地。它们都处理不同的操作模式。只是任务更可见、更常用,因为它们的用例更常见。


推荐阅读