簡體   English   中英

在沒有等待的情況下調用異步方法會發生什么?

[英]What happens when calling an async method without await?

我想知道如果我在沒有使用await的情況下調用標記為async的方法會發生什么。 考慮這個例子:

private int id = 0;
async Task Initialize()
{
     var content = await LoadFromDisk(id);
     await Process(content);
     return;
}

DataId
{
    get { return id; }
    set { id = value; Initialize(); }
}

我知道這會產生編譯警告,但我的問題是,如果在Initialize()中等待的方法調用仍然可以像預期的那樣工作。 正如您所看到的那樣,setter不需要等待Initialize(),因為沒有返回值,它是屬性的setter的最后一次調用。 這是一種火,忘了。

我想這樣做的原因是我想將MVVM和數據后端結合起來,迫使我使用異步方法。

在上面的示例中,用戶從列表中選擇條目,程序應該在視圖的另一部分中顯示有關條目的詳細信息。

我想將列表的當前選定條目綁定到DataId,每當用戶更改選擇時,它都會更新詳細信息視圖。 當然,可以從事件處理程序執行異步方法調用,但為了更清晰的MVVM實現(主要使用數據綁定),我想避免使用事件處理程序。

如果在不等待任務的情況下調用async Task方法,則將以靜默方式忽略該方法的任何異常。 如果你調用async void方法(你在問題標題中提到,但你的代碼沒有這樣做),那么將在SynchronizationContext上重新引發該方法的任何異常 - 在這種情況下,直接發送到UI主循環。

我有關於異步屬性的博客文章 最后一節介紹NotifyTaskCompletion類型 ,該類型專為異步數據綁定而設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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