[英]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.