【发布时间】:2016-12-26 22:00:12
【问题描述】:
我正在重写基类库中的方法。但是,在我重写的实现中,我使用了新的 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
我目前的解决方案是以同步方式使用 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;
}
}
还有其他方法吗?
【问题讨论】:
-
很遗憾,没有好的解决方案(这违反了 LSP)。你能创建一个异步包装器吗?
标签: c# async-await