簡體   English   中英

覆蓋非異步方法時如何正確調用C#異步方法?

[英]How to properly call a C# async method when overriding an non-async method?

我正在為RazorPage創建TagHelper。 TagHelper類的唯一要求是覆蓋處理方法。

這是簽名(感謝您的解決方案,斯蒂芬讓我們假設ProcessAsync不存在,所以我們仍然可以回答問題)。

public override void Process(TagHelperContext context, TagHelperOutput output)

身體很簡單

if(_roleService.CanRegisterAsync().Result)
{
    output.SuppressOutput();
}

我聽說死鎖可能是由在異步方法上調用.Result引起的,所以我不想像上面寫的那樣調用它,因為看來我可能會遇到一些麻煩。

因此,我通過添加異步來更改虛擬覆蓋

public override async void Process(TagHelperContext context, TagHelperOutput output)

和身體

if(await _roleService.CanRegisterAsync())
{
    output.SuppressOutput();
}

這樣編譯就可以了,但是output.SupressOutput()似乎不再起作用了,所以我不得不回到原始代碼,這似乎是個壞主意。

有什么更好的方法來處理這種情況,這樣我就不會像其他人在其他異步帖子中所說的那樣陷入僵局?

您需要創建一個異步標簽助手 換句話說,重寫ProcessAsync而不是Process 這樣,您可以使用await

public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
  if(await _roleService.CanRegisterAsync())
  {
    output.SuppressOutput();
  }
  ...
}

顯然,您追求的是以下內容:

if(_roleService.CanRegisterAsync().WaitAndUnwrapException())
{
    output.SuppressOutput();
}

備注 :該方法的名稱強烈建議使用try/catch處理可能的異常

暫無
暫無

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

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