微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 在void方法中使用async等待

我有方法签名我不能改变.它应该是
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方法编写此代码,而不会更改包含方法的签名

解决方法

你仍然可以使一个void方法异步:
protected async void CannotChangeSignature()
{
    ...
}

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

>无效
>任务
>任务< T>

但是,如果你想让它实际上被阻止,那么你基本上是与平台进行对抗 – 最重要的是避免阻塞.

你说你不能改变签名 – 但是如果你依靠这个封锁,那么你必须改变编码方式.

理想情况下,您应该将签名更改为Task< bool&gt ;::

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

编辑:如果你真的需要一个阻止它,你只需要调用AsTask().Wait(),捕获AggregateException并检查它是否包含FileNotFoundException.这真的很可怕,但是你可以不围绕这个设计,这样就不需要阻止了吗?例如,开始检查文件,并显示错误(或任何),如果以及何时发现它不存在.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐