我试图使方法async
与其他方法异步,但返回错误。
public Task<string> Smethod0(HttpWebRequest httpWebRequest0)
{
return new StreamReader(Smethod_1(httpWebRequest0).GetResponseStream(),
Encoding.UTF8, true).ReadToEndAsync();
}
public Task<string> Smethod_1(HttpWebRequest httpWebRequest0)
{
HttpWebResponse httpWebResponse;
try
{
httpWebRequest0.Method = "GET";
httpWebResponse = (HttpWebResponse)httpWebRequest0.GetResponse();
}
catch (Exception ex)
{
ProjectData.SetProjectError(ex);
httpWebResponse = (HttpWebResponse)null;
ProjectData.ClearProjectError();
}
return httpWebResponse;
}
“无法将类型System.Net.HttpWebResponse隐式转换为System.Threading.Task” 作为回报
不知道如何解决。
答案 0 :(得分:0)
return Task.FromResult(httpWebResponse);
应该解决您的错误,但是由于Smethod_1中没有调用任何异步方法并且Smethod_1缺少
,因此它不会真正实现异步。 public async Task<string> Smethod_1
答案 1 :(得分:0)
正如Neil在评论中指出的那样,Smethod_1
返回HttpWebResponse
,但是该方法被声明为返回Task<string>
。错误消息告诉您HttpWebResponse
不能隐式转换为Task
。
按照jondow的回答,更改Smethod_1
的声明以返回Task<HttpWebResponse>
,并返回return Task.FromResult(httpWebResponse)
,应该可以纠正您现在看到的错误。但是,然后您会在Smethod0
中遇到编译器错误,因为您是在GetResponseStream
的结果上调用Smethod_1
...这会返回Task<HttpWebResponse>
,而不仅仅是返回HttpWebResponse
。 Task<HttpWebResponse>
没有名为GetResponseStream
的方法。
您需要await
Task
返回的Smethod_1
才能获得HttpWebResponse
。为此,您需要制作Smethod0
async
。
public async Task<string> Smethod0(HttpWebRequest httpWebRequest0)
{
var response = await Smethod_1(httpWebRequest0);
using (var reader new StreamReader(response.GetResponseStream(),
Encoding.UTF8, true))
{
return await reader.ReadToEndAsync();
}
}
public Task<HttpWebResponse> Smethod_1(HttpWebRequest httpWebRequest0)
{
HttpWebResponse httpWebResponse;
try
{
httpWebRequest0.Method = "GET";
httpWebResponse = (HttpWebResponse)httpWebRequest0.GetResponse();
}
catch (Exception ex)
{
ProjectData.SetProjectError(ex);
httpWebResponse = (HttpWebResponse)null;
ProjectData.ClearProjectError();
}
return Task.FromResult(httpWebResponse);
}
将Smethod0
更改为async
意味着调用它的方法需要自己成为async
,以便Smethod0
被await
编辑。
所有这些,说明您在Smethod_1
中没有异步进行任何操作。即使返回Task
,即使将async
关键字放在函数声明中,如果调用的方法同步执行,它也不会异步执行。
HttpWebRequest
不使用任务并行库进行异步操作,它使用了异步编程模型(BeginGetResponse
和EndGetResponse
)。如果您确实希望Smethod_1
是异步的,并且想使用Task
,则需要包装BeginGetResponse
和EndGetResponse
。有关示例,请参见Interop with Other Asynchronous Patterns。