C# 不等待调用异步方法

C# 不等待调用异步方法,c#,async-await,C#,Async Await,我正在为WindowsPhone8+应用程序开发映像加载程序库,当然它支持磁盘缓存 因此,我需要在不等待结果的情况下将映像异步保存到磁盘上: // Async saving to the storage cache without await // ReSharper disable once CSharpWarnings::CS4014 Config.StorageCacheImpl.SaveAsync(imageUrl, downloadResult.ResultStream) .C

我正在为WindowsPhone8+应用程序开发映像加载程序库,当然它支持磁盘缓存

因此,我需要在不等待结果的情况下将映像异步保存到磁盘上:

// 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结果为true

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

所以我异步地将图像缓存到IsolatedStorageFile中,而且-这无关紧要,它是否会被缓存,因为如果不是-JetImageLoader将再次加载它

是否可以禁用此警告


另外,如果您想查看JetImageLoader源代码,我可以给您一个指向GitHub的链接。

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

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

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);
  }
}

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

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

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);
  }
}

实际上,这个警告是因为你没有等待ContinueWith的结果。编译器可以看到您正在使用SaveAsync的结果执行某些操作。还请注意,如果调用异步代码的方法本身不是异步的,则不会出现警告。实际上,出现警告是因为您没有等待ContinueWith的结果。编译器可以看到您正在使用SaveAsync的结果执行某些操作。还请注意,如果调用异步代码的方法本身不是异步的,则不会发出警告。感谢您对局部变量的建议,它很有帮助:关于ContinueWith-我将其放在那里,因为库用户可以使用自己的缓存组件实现,因此,他可能会忘记在他的建议中添加这一点;哦,我明白了,你建议为它创建一个方法,而不是使用ContinueWith,好的,谢谢你对局部变量的建议,这很有帮助:关于ContinueWith-我把它放在那里是因为库用户可以使用自己的缓存组件实现,所以他可能忘记在他的impl中添加它;哦,我明白了,你建议为它创建一个方法,而不是使用ContinueWith,好吗