簡體   English   中英

Async / Await沒有等待呼叫

[英]Async/Await without await call

我有一個虛擬方法,有時包含等待調用,有時不包含。 IDE確實給了我警告,處理這個問題的正確方法是什么?

在我的基類:

protected virtual async Task GoNext ()

從基類開始,它通過await調用。

然后在我的子類中,我重寫了這個方法,但有時候它確實包含了await和它沒有的時間。

async關鍵字實際上不是繼承方法簽名的一部分,而是更多的編譯器信號,它需要根據異步方法的模式編譯和重寫方法。

因此,如果繼承的方法不使用await關鍵字,則可以在繼承的方法上省略async關鍵字。

請注意,您仍然必須返回TaskTask<T> ,該部分繼承方法簽名的一部分。

所以這會給你一個警告:

class Base
{
    public virtual async Task<int> Method()
    {
        await Task.Delay(10);
        return 42;
    }
}

class Derived : Base
{
    // next line produces warning
    public override async Task<int> Method()
    {
        return 42;
    }
}

警告是這樣的:

警告:CS1998此異步方法缺少'await'運算符並將同步運行。 考慮使用await運算符等待非阻塞API調用,或者await Task.Run(...)在后台線程上執行CPU綁定工作。

但是,這不會產生警告:

class Derived : Base
{
    public override Task<int> Method()
    {
        return Task.FromResult(42);
    }
}

請注意,我在最后一個方法中更改了return語句,因為async關鍵字帶來的“魔法”部分是自動將返回值包裝在Task<T> 如果你有其他方法可以獲得Task<T> ,顯然你不需要像上面那樣包裝結果。

暫無
暫無

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

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