首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跳转等待自动使异步代码同步吗?

跳转等待自动使异步代码同步吗?
EN

Stack Overflow用户
提问于 2021-05-01 11:08:02
回答 1查看 272关注 0票数 0

我有以下几点:

代码语言:javascript
复制
void SaveImage(Texture tex, string path)
{
    WritePngAsync(tex, path);
}

public static async void WritePngAsync(Texture tex, string path)
{
    // This code takes a long time to execute
    await PNG.WriteAsync(texture, path);
}

我这样称呼它:

代码语言:javascript
复制
for (int i = 0; i < 3; i++)
{
    var imageData = createData();// Create image data somehow
    SaveImage(imageData, $"{i}.png");
}

我预计会发生的情况是,循环将立即完成,因为即使WritePngAsync需要很长时间,SaveImage也不会被等待,并且会立即返回。

我认为这会导致文件内容在调用时被覆盖的问题,但是让我认为代码是自动转换为同步代码的(尽管不可能知道什么时候完成了WriteAsync )。

我省略了await而没有将SaveImage声明为async这一事实是否使作为同步函数的使用变得安全?

换句话说,从非异步方法调用awaited函数会自动使代码同步执行并在完成时返回。

或者同步SaveImage会在WritePngAsync完成之前立即返回吗?

从评论中:

省略等待确实会导致SaveImage()方法同步执行。但是,这不会传播到WritePngAsync()方法

因此,这会导致一个可以在函数调用完成之前返回的synchronous

如果PNG.WriteAsync在写入前将纹理数据临时放入内存位置,那么连续调用是否可以将其数据放在相同的位置,从而在写入之前的图像时覆盖该图像,还是SaveImage同步会阻止这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-01 13:15:07

我省略了等待而没有将SaveImage声明为异步的事实是否使它实际上是同步的?

不是的。由于几个原因,async void方法是危险的。它们是异步的,但是您的代码无法检测异步操作何时完成。此外,由于您的代码无法检测来自异步操作的错误,因此任何异常都会直接在当前上下文中引发,这通常会导致应用程序关闭。这种行为似乎很奇怪--这是一种不受欢迎的行为,直到您意识到async void方法是专门设计用来作为事件处理程序和在其他情况下应该避免。的。

我预计会发生的情况是,循环将立即完成,因为即使WritePngAsync需要很长时间,SaveImage也不会被等待,并且会立即返回。

是的,循环完成得很快,当循环完成时,所有的PNG.WriteAsync操作都可能是不完整的。

我认为这会导致文件内容在像这样被调用时被覆盖的问题

听起来很合理。您的代码无法知道WritePngAsync方法何时完成。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67345559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档