假设我有以下内容:
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);
}
然后我这样称呼它:
for (int i = 0; i < 3; i++)
{
var imageData = createData();// Create image data somehow
SaveImage(imageData, $"{i}.png");
}
我省略了await
并且没有将saveimage
声明为async
这一事实是否使它实际上是异步的?
我希望发生的情况是循环会立即完成,因为即使WritePngasync
花费了很长时间,SaveImage
也不会被等待,并且会立即返回。
我认为这会导致文件内容在这样调用时被覆盖的问题,但这使我认为代码是以某种方式自动转换为同步代码的(尽管似乎不可能知道writeasync
何时完成)。
那么,简单地说,从非异步方法调用autited
函数是否会自动使代码同步执行,以及省略async
和await
(如在saveimage
函数中省略async
和await
会有什么潜在问题。
我省略了await并且没有将SaveImage声明为async这一事实是否使它实际上[synchronou]?
不,Async void
方法由于几个原因是危险的。它们是异步的,但是您的代码没有办法检测异步操作何时完成。此外,由于您的代码无法检测异步操作中的错误,因此任何异常都将直接在当前上下文中引发,这通常会导致应用程序关闭。这种行为看起来非常奇怪而且不可取,直到您意识到async void
方法是专门设计用来用作事件处理程序的,在其他情况下应该避免使用。
我希望发生的是,循环会立即完成,因为即使WritePngAsync花费了很长时间,SaveImage也不会被等待,并且会立即返回。
是的,循环很快完成,并且当循环完成时,所有png.writeasync
操作可能都不完整。
我认为这会导致文件内容在这样调用时被覆盖的问题
听起来很合理。您的代码无法知道writePngasync
方法何时完成。