在void方法中使用async await

时间:2012-08-03 21:13:22

标签: c# xaml asynchronous windows-8 async-await

我有签名的方法我无法改变。它应该是

protected override void OnInitialize()

使用Windows 8 Metro API我需要检查文件是否存在并在此NoSignatureChange方法中读取它。 使用PlainOldCSharp,我会写类似

的东西
protected override void OnInitialize()
{
  ...
  try
  {
    var file = folder.OpenFile(fileName);
    fileExists=true;
  }
  catch(FileNotFoundException)
  {
    fileExists=false
  }
}

请记住,Windows 8 API only way to check if file exists is handling FileNotFoundException 此外,在Windows 8 API中,所有FileIO API都是异步的,因此我只有file.OpenFileAsync方法。

所以,问题是:如何使用Windows 8 API中的folder.OpenFileAsync方法编写此代码而不更改包含方法的签名

1 个答案:

答案 0 :(得分:18)

您仍然可以使void方法异步:

protected async void CannotChangeSignature()
{
    ...
}

异步方法的有效返回类型是:

  • void
  • Task
  • Task<T>

但是,如果你想让它实际阻止,那么你基本上是在与平台作斗争 - 整点就是避免阻塞。

您说您无法更改签名 - 但如果您依赖此阻止,那么您 会改变您进行编码的方式。

理想情况下,您应将签名更改为Task<bool>

protected async Task<bool> CannotChangeSignature()
{
  ...
  try
  {
    await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
    return true;
  }
  catch(FileNotFoundException)
  {
    return false;
  }
}

编辑:如果真的需要阻止,你只需要调用AsTask().Wait(),抓住AggregateException并检查它是否包含FileNotFoundException }。它确实非常可怕......你能不能围绕这个进行设计,以便它需要阻塞吗?例如,开始检查文件,如果发现它不存在则显示错误(或其他)。