無需等待即可返回任務

執行非同步操作的方法在以下情況下不需要使用 await

  • 方法中只有一個非同步呼叫
  • 非同步呼叫位於方法的末尾
  • 不需要在任務中發生捕獲/處理異常

考慮這個返回 Task 的方法:

public async Task<User> GetUserAsync(int id)
{
    var lookupKey = "Users" + id;

    return await dataStore.GetByKeyAsync(lookupKey);
}

如果 GetByKeyAsyncGetUserAsync 具有相同的簽名(返回 Task<User>),則可以簡化該方法:

public Task<User> GetUserAsync(int id)
{
    var lookupKey = "Users" + id;

    return dataStore.GetByKeyAsync(lookupKey);
}

在這種情況下,該方法不需要標記為 async,即使它正在執行非同步操作。GetByKeyAsync 返回的任務直接傳遞給呼叫方法,它將被呼叫。

重要說明 :返回 Task 而不是等待它,會更改方法的異常行為,因為它不會在啟動任務的方法中丟擲異常,而是在等待它的方法中。

public Task SaveAsync()
{
    try {
        return dataStore.SaveChangesAsync();
    }
    catch(Exception ex)
    {
        // this will never be called
        logger.LogException(ex);
    }
}

// Some other code calling SaveAsync()

// If exception happens, it will be thrown here, not inside SaveAsync()
await SaveAsync();

這將提高效能,因為它將節省編譯器生成額外的非同步狀態機。