簡體   English   中英

在void方法中使用async await

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM