我有签名的方法我无法改变。它应该是
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方法编写此代码而不更改包含方法的签名
答案 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
}。它确实非常可怕......你能不能围绕这个进行设计,以便它不需要阻塞吗?例如,开始检查文件,如果发现它不存在则显示错误(或其他)。