long 运行 异步方法在延迟之前会发生什么?

What happens in long running async method before delay?

我有一种每秒向我的服务器发送请求的方法。

public async Task StartRequestProcess(CancellationToken stoppingToken)
{
    while (!stoppingToken.IsCanecllationRequested)
    {
       var result = await GetDataFromServerAsync();
       await Task.Delay(1000, stoppingToken);
    }
}

但我的 GetDataFromServerAsync() 方法有时需要 10 或 15 秒。

这段时间(10 或 15 秒)做什么?

进程会等到完成长请求吗?还是会每秒发送新请求而无需等待?

当您调用 await GetDataFromServerAsync() 时,您的方法的执行将在异步操作完成后恢复,例如,在 10 到 15 秒后。只有这样你才会异步等待一秒钟。

TAP(任务异步模式)的整体思想是单个线程可以处理很多事情 "simultaneously" 因为它可以返回到它之前正在做的事情,任何时候 await 正在处理。这就是为什么方法上的异步标记倾向于在层次结构中从您编写的代码(例如您的控制器 Get 方法)的第一点到您调用的每个方法的第一点,一直到您需要的地方的每个方法等待数据库或网络 IO 之类的东西。

遇到 await 有点像抛出一个未捕获的异常 - 控制流直接返回整个方法堆栈,即您的代码,然后从顶部返回到发生的任何事情之前,在你的代码之外。抛出的异常和等待状态机之间的区别在于,当等待的任务完成时,去执行其他事情的线程将回到等待的位置并从那里继续

它之前所做的是高度相关的 - 在你的情况下它可能是 "waiting for a TCP client to connect and send some data"

现在,在你的代码中,线程回到它之前做的事情——你说它需要 15 秒,所以线程将自己忙于其他事情 15 秒,然后它会回来等待你的1000ms 任务完成,然后它会循环并发出另一个请求。实际上,这意味着您的代码每 16 秒就会发出一个请求;不是你所希望的每一秒的请求。使用定时器

I have a method that sends a request to my server every second.

不,你没有。请不要以虚假陈述开题;这让他们很难回答!

您的工作流程是:

  • 请求数据
  • 等待数据到达——这就是异步等待的意思。 await异步等待.
  • 数据到达后,再次异步暂停一秒钟
  • 重复。

这不是工作流程 "send a request every second"。那就是工作流程 "send a request one second after the last request succeeded".

What does in this time (10 or 15 seconds)?

异步等待。您说要异步等待数据可用,这就是它所做的。在异步等待期间,可以安排其他任务在线程上执行。

Will the workflow wait until the long request is completed?

是的。它将 异步等待 。同样,这就是 await 的意思。意思是异步等待.

Will new requests send every second without wait?

没有。你说等接收到数据再暂停一秒,原来是这样。