簡體   English   中英

具有異步覆蓋的同步基礎方法

[英]Synchronous base method with async override

我有一個基類,其子類可能希望異步實現方法。 我已經實現如下,但是Visual Studio建議使基GetEntityName同步,因為它不會await任何東西。 但是,這會使孩子受傷。

有沒有更好的辦法?

  public abstract class BaseHandler
  {
        protected virtual async Task<string> GetEntityName(object entity)
        {
            return string.Empty;
        }
  }



 public class ChilldHandler: BaseHandler
 {
        protected override async Task<string> GetEntityName(object entity)
        {
            return await LongRunningService.DoSomething(entity);
        }
 }
public abstract class BaseHandler
{
    protected virtual Task<string> GetEntityName(object entity)
    {
        return Task.FromResult(string.Empty);
    }
}

由於您的方法無法執行等待的任何操作,因此可以使用Task.FromResult方法返回已完成的Task。

您不需要等待GetEntityName內的任何內容,因為不會等待任何不完整的Task。

async是它出現的特定方法的實現細節 無論出現在何處,它都不構成方法簽名的一部分。 (這也是為什么不允許在接口1中進行async原因-因為它們沒有實現,並且不屬於方法簽名)。

也就是說,任何虛擬Task返回方法都override在不使用/不使用async子類中具有override實現,並且與原始基礎方法的標記方式也不相關。

正如FCin所示 ,完全有可能使同步方法仍返回您想要的Task作為該方法的返回類型。


1忽略接口的新型默認實現。

暫無
暫無

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

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