[英]Using async await inside void method
我有簽名的方法我無法改變。 它應該是
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<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
。 它確實非常可怕......你能不能圍繞這個進行設計,這樣它就不需要阻塞了嗎? 例如,開始檢查文件,並在您發現它不存在時顯示錯誤(或其他)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.