gpt4 book ai didi

c# - 在 void 方法中使用异步等待

转载 作者:太空狗 更新时间:2023-10-29 17:36:00 24 4
gpt4 key购买 nike

我有我无法更改的带有签名的方法。应该是

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()
{
...
}

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

  • 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() , catch AggregateException并检查它是否包含 FileNotFoundException .虽然这真的很可怕......你能不能围绕这个进行设计,以便它不需要阻塞?例如,开始检查文件,并在发现文件不存在时显示错误(或其他错误)。

关于c# - 在 void 方法中使用异步等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11803370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com