[英]Async/Await without await call
我有一個虛擬方法,有時包含等待調用,有時不包含。 IDE確實給了我警告,處理這個問題的正確方法是什么?
在我的基類:
protected virtual async Task GoNext ()
從基類開始,它通過await調用。
然后在我的子類中,我重寫了這個方法,但有時候它確實包含了await和它沒有的時間。
async
關鍵字實際上不是繼承方法簽名的一部分,而是更多的編譯器信號,它需要根據異步方法的模式編譯和重寫方法。
因此,如果繼承的方法不使用await
關鍵字,則可以在繼承的方法上省略async
關鍵字。
請注意,您仍然必須返回Task
或Task<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.