gpt4 book ai didi

c# - 什么会导致标有 async 的方法同步执行,即使它包含 await 调用?

转载 作者:行者123 更新时间:2023-11-30 21:09:58 31 4
gpt4 key购买 nike

我正在尝试调试同事不在时编写的一些代码。

调用如下:

var sw = Stopwatch.StartNew();
logger.Trace("Time A: {0}ms", sw.ElapsedMilliseconds); // Roughly 0ms
pt.Task = ProcessMetricsWorker(pt.CancelTokenSource);
sw.Stop();
logger.Trace("Time B: {0}ms", sw.ElapsedMilliseconds); // Over 20000ms!

这是方法签名:

async Task ProcessMetricsWorker(CancellationTokenSource cancelTokenSource)

该方法运行大约需要 20 秒,根据我在上面引用的第一行之前和之后放置的日志记录,任务正在同步执行,就好像 async 部分被忽略了一样。什么会导致这种情况发生?

请注意,在异步方法中有一个 await 调用。它位于一个 while 循环内,但我无法想象这会有什么不同。

// internal to the method referenced above
result = await metricProcessor.ProcessItem(domain);

此外,我还创建了一个运行非常简单的异步/等待设置的小型测试应用程序,以确保等待在我运行它的服务器上确实有效,并且它在我的小型测试用例中也能正常工作,只是没有在我尝试调试的主应用程序中。

最佳答案

每个 async方法作为常规方法调用启动。它只会在第一次执行 await 时变为异步(在屈服于其调用者的意义上)。在等待(尚未完成)上。

因此,ProcessMetricsWorker 中发生的事情有几种可能性。 :

  • 在第一个 await 之前可能包含一些长时间运行的同步代码.
  • 许多第一个等待它的人await s 可能已经完成。如果它们全部已经完成,那么ProcessMetricsWorker实际上是同步的。

“快速路径”blog post包含有关如何 await 的更多详细信息转换为代码,并显示它如何仅在作用于未完成的可等待对象时才会产生。

关于c# - 什么会导致标有 async 的方法同步执行,即使它包含 await 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8753282/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com