在void方法内部使用异步等待
本文关键字:异步 等待 内部 void 方法 | 更新日期: 2024-09-22 21:36:47
我有一个带有签名的方法,无法更改。应该是
protected override void OnInitialize()
使用Windows8 Metro API,我需要在NoSignatureChange方法中检查文件是否存在并读取它。使用PlainOldCSharp,我会写一些类似的东西
protected override void OnInitialize()
{
...
try
{
var file = folder.OpenFile(fileName);
fileExists=true;
}
catch(FileNotFoundException)
{
fileExists=false
}
}
请记住,在Windows 8 API中,检查文件是否存在的唯一方法是处理FileNotFoundException此外,在Windows8 API中,所有的FileIO API都是异步的,所以我只有文件。OpenFileAsync方法。
因此,问题是:我应该如何使用文件夹编写此代码。Windows 8 API中的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()
,捕获AggregateException
并检查它是否包含FileNotFoundException
。这真的很可怕。。。你能不能不围绕这个进行设计,这样它就不需要阻塞了?例如,开始检查文件,并在发现它不存在时显示错误(或其他任何错误)。
public async void CalculateData()
{
await ProcessData();
}
private async Task ProcessData()
{
await Task.Run(() =>
{
//time taking process
});
}
或者你可以使用
public void CalculateData()
{
ProcessData();
}
private async void ProcessData()
{
await Task.Run(() =>
{
//time taking process
});
}