C# BackgroundService.StartAsync,它应该在启动或阻止期间完成吗?

C# BackgroundService.StartAsync,它应该在启动或阻止期间完成吗?,c#,asp.net-core,task-parallel-library,asp.net-core-3.1,c#-8.0,C#,Asp.net Core,Task Parallel Library,Asp.net Core 3.1,C# 8.0,我不知道我是否遗漏了这个谜题中的某个部分,但就我通常使用的服务而言,对Start的任何调用都应该始终返回,以便您知道您的服务已经启动 我正在学习背景服务: 在这两个例子中,他们都使用while循环来实现ExecuteAsync(由StartAsync调用),这意味着ExecuteAsync(扩展为StartAsync)只有在取消时才会返回(比如应用程序关闭时) 这与我从服务中了解的情况相矛盾,因为您如何判断服务已成功启动,而不是在启动时挂起 我真的很希望能澄清一下这一点,因为我似乎无法了解正

我不知道我是否遗漏了这个谜题中的某个部分,但就我通常使用的服务而言,对
Start
的任何调用都应该始终返回,以便您知道您的服务已经启动

我正在学习
背景服务


在这两个例子中,他们都使用
while循环
来实现
ExecuteAsync
(由
StartAsync
调用),这意味着
ExecuteAsync
(扩展为
StartAsync
)只有在取消时才会返回(比如应用程序关闭时)

这与我从服务中了解的情况相矛盾,因为您如何判断服务已成功启动,而不是在启动时挂起

我真的很希望能澄清一下这一点,因为我似乎无法了解正在发生的事情,也找不到任何与此相关的进一步信息

编辑:添加了从
BackgroundService
调用
ExecuteAsync
的说明:

public virtual Task StartAsync(CancellationToken cancellationToken)
{
    // Store the task we're executing
    _executingTask = ExecuteAsync(_stoppingCts.Token);

    // If the task is completed then return it,
    // this will bubble cancellation and failure to the caller
    if (_executingTask.IsCompleted)
    {
        return _executingTask;
    }

    // Otherwise it's running
    return Task.CompletedTask;
}

你能举个例子说明ExecuteAsync是“从StartAsync调用”的吗?啊,那个!它调用ExecuteAsync,它立即返回一个任务。StartAsync然后继续返回CompletedTask本身。换句话说:对ExecuteAsync的调用不会阻塞。这就是为什么ExecuteAsync可以包含一个“(近)infinte”循环来表示服务的生命周期。您可以将
ExecuteAsync
视为在点击
wait Task.Delay
时返回。它继续运行,正如它返回的
任务
所表示的那样,但在那一点上它不再阻塞
StartAsync
。啊,克拉姆,很明显,这是一个多么伟大的时刻啊。希望有一天我的困惑能帮助像我这样的人。谢谢@KirkLarkin@Fildor谢谢,我没有得到解释,因为我显然错过了拼图中的
wait
部分,而这一部分正是拼图的关键所在。
public virtual Task StartAsync(CancellationToken cancellationToken)
{
    // Store the task we're executing
    _executingTask = ExecuteAsync(_stoppingCts.Token);

    // If the task is completed then return it,
    // this will bubble cancellation and failure to the caller
    if (_executingTask.IsCompleted)
    {
        return _executingTask;
    }

    // Otherwise it's running
    return Task.CompletedTask;
}