在void方法中使用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中只检查文件是否存在正在处理FileNotFoundException此外,在Windows 8 API中所有FileIO API都是异步的,所以我只有file.OpenFileAsync方法。

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

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

 protected async void CannotChangeSignature() { ... } 

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

  • void
  • Task
  • Task

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

你说你不能改变签名 – 但是如果你依赖于这种阻塞,那么你必须改变你接近编码的方式。

理想情况下,您应该将签名更改为Task

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

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