gpt4 book ai didi

c# - 在 C# 中等待异步任务时会发生什么?

转载 作者:行者123 更新时间:2023-11-30 19:52:48 32 4
gpt4 key购买 nike

根据我在所有 C# async/await 教程中的理解,我了解到当我们定义一个异步方法时,这意味着我们可以在其中添加 await 关键字,并将任务作为参数,使该方法返回到如果任务太长,调用者。该方法可以在任务完成后恢复。

public void MyMainMethod()
{
DoSomethingAsync();
KeepOnDoingOtherStuff();
}

public async Task DoSomethingAsync()
{
//Do whatever
await LongOperation();
// Rest of the method that is executed when the long operation is
//finished.

}

所以在这里,当长时间的操作正在进行时,在等待时,DoSomething 异步将手交给 MainMethod 并执行 KeepOnDoingOtherStuff。好的

现在我的问题是我的 DoSomethingAsync 本身是否在等待。在这种情况下:

public async void MyMainMethod()
{
await DoSomethingAsync();

//Here is a critical method that I want to execute only when
//DoSomethingAsync is finished

CriticalStuff();
}

public async Task DoSomethingAsync()
{
//Do whatever
await LongOperation();
// Rest of the method that is executed when the long operation is
//finished.

}

现在我等待我的 DoSomethingAsync 以便我确定它不会继续,但问题是 DoSomethingAsync () 在等待 LongOperation() 时仍将手交给调用者,并且我的 Main 方法恢复,这是我不想要的,因为它执行了我的关键任务。

在异步逻辑中有一些我非常怀念的东西,那么“等待”一个内部有异步方法的方法有什么意义呢?

如果能解决我的问题,我将不胜感激。

提前致谢。

最佳答案

我认为这里的不匹配来自这些词:

to make the method return to caller if the task is too long.

确切地说,

awaitlong 无关。它是关于异步的。如果某些事情需要很长时间但发生在本地 CPU 上,那么可以肯定:它不是真正适合 await(尽管您可以使用 await 机制作为将事物推送到工作线程的便捷方式,然后在它完成时重新加入同步上下文线程)。

不过,更好的例子是当任务是外部时;它可以是对 SQL 数据库、redis、http、通过某种 IO 层的另一个进程的调用,或者等待套接字数据。请注意,即使与物理本地 SSD 存储通信也可能需要长时间等待,至少从 CPU 速度来看是这样。当本地线程除了阻塞(等待回复)什么都不做时,那么:在许多情况下,线程可以做的事情要好得多。

对于客户端应用程序,这些“更好的事情”包括绘制 UI 和响应输入。对于服务器应用程序,那些“更好的事情”包括为其他并发请求/负载提供服务。


当以这种方式衡量时:await 充当编写需要来自外部源的数据的代码的有效方式,但不想只是阻塞当前线程当数据到达时。如果这不是您的场景:await 可能不适合您。

关于c# - 在 C# 中等待异步任务时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53499166/

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