gpt4 book ai didi

c# - 将覆盖的成员更改为异步

转载 作者:可可西里 更新时间:2023-11-01 07:58:37 24 4
gpt4 key购买 nike

我正在覆盖基类库中的一个方法。但是,在我重写的实现中,我使用的是新的 HttpClient,它全部基于异步方法。因此,我必须将我的方法标记为异步,这意味着我需要将方法的返回参数从字符串更改为任务。然而,编译器给出了一个错误:“返回类型必须是‘字符串’才能匹配覆盖的成员……”

    public class BaseClass
{
public virtual string GetName()
{
...
}
}

public class MyClass : BaseClass
{
public override async Task<string> GetName()
{
HttpClient httpClient = new HttpClient();
var response = await httpClient.GetAsync("");
if (response.IsSuccessStatusCode)
{
var responseContent = response.Content;

return await responseContent.ReadAsStringAsync();
}

return null;
}
}

当然,显而易见的解决方案是将 BaseClass 中的 GetName() 的返回类型更改为 Task ,但我无法控制 BaseClass,因为它是一个外部库;

我当前的解决方案是以同步方式使用 HttpClient 类,即按如下方式更改 MyClass:

    public class MyClass : BaseClass
{
public override string GetName()
{
HttpClient httpClient = new HttpClient();
var response = httpClient.GetAsync("");
if (response.Result.IsSuccessStatusCode)
{
var responseContent = response.Result.Content;

return responseContent.ReadAsStringAsync()
.Result;
}

return null;
}
}

还有其他方法吗?

最佳答案

不幸的是这里没有好的解决方案。无法用异步方法覆盖非异步方法。我认为你最好的选择是拥有一个 async 非覆盖方法并从非异步方法调用它:

public class MyClass : BaseClass 
{
public override string GetName()
{
return GetNameAsync().Value;
}

public async Task<string> GetNameAsync()
{
...
}
}

请注意,这可能会导致问题。如果原始代码不期望执行任何 async 代码,那么引入此模式可能会打破预期。如果可能,我会避免它。

关于c# - 将覆盖的成员更改为异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15317961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com