无需等待即可调用异步方法

时间:2013-08-06 11:44:45

标签: c# async-await

我正在为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会再次加载它。

是否可以禁用此警告?

P.S。如果你想看JetImageLoader来源,我可以给你一个GitHub的链接。

1 个答案:

答案 0 :(得分:8)

编译器警告存在,因为执行此操作几乎总是错误的。首先,您没有得到任何已完成任务的通知,也没有收到错误通知。

要避免编译器警告,您只需将其分配给未使用的局部变量,如下所示:

var _ = Config.StorageCacheImpl.SaveAsync...

在您的情况下,我还建议使用辅助方法而不是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);
  }
}