调用异步方法而不等待

本文关键字:等待 异步方法 调用 | 更新日期: 2023-09-27 18:26:32

我正在为Windows Phone 8+应用程序开发图像加载程序库,当然它支持磁盘缓存。

所以,我需要异步地将图像保存在磁盘上,而不需要等待结果:

// Async saving to the storage cache without await
// ReSharper disable once CSharpWarnings::CS4014
Config.StorageCacheImpl.SaveAsync(imageUrl, downloadResult.ResultStream)
    .ContinueWith(
        task => 
        {
            if (task.IsFaulted || !task.Result)
            {
                Log("[error] failed to save in storage: " + imageUri);
            }
        }
);

如您所见,SaveAsync()是异步方法,它返回Task<bool>,其中如果保存了图像,则bool结果为true。

问题是编译器显示警告,因为我没有等待异步方法的结果,但是我不需要等待。我需要尽快将下载的图像返回给用户代码,在调用SaveAsync()后,我返回下载的图像。

因此,我正在异步地将图像缓存到IsolatedStorageFile,此外,它是否被缓存并不重要,因为如果没有,JetImageLoader将再次加载它。

是否可以禁用此警告?

附言:如果你想看看JetImageLoader的来源,我可以给你一个GitHub的链接。

调用异步方法而不等待

编译器发出警告是因为这样做几乎总是错误的。首先,您不会收到任务完成的任何通知,也不会收到错误通知。

为了避免编译器警告,您可以将其分配给一个未使用的局部变量,如下所示:

var _ = Config.StorageCacheImpl.SaveAsync...

在您的情况下,我还建议使用helper方法而不是ContinueWith来使代码更干净:

private static async Task SaveAsync(string imageUrl, Stream resultStream)
{
  bool success = false;
  try
  {
    success = await Config.StorageCacheImpl.SaveAsync(imageUrl, downloadResult.ResultStream);
  }
  finally
  {
    if (!success)
      Log("[error] failed to save in storage: " + imageUri);
  }
}