我如何异步方法C#

时间:2019-09-25 14:48:20

标签: c#

我试图使方法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” 作为回报

不知道如何解决。

2 个答案:

答案 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>,而不仅仅是返回HttpWebResponseTask<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,以便Smethod0await编辑。

所有这些,说明您在Smethod_1中没有异步进行任何操作。即使返回Task,即使将async关键字放在函数声明中,如果调用的方法同步执行,它也不会异步执行。

HttpWebRequest不使用任务并行库进行异步操作,它使用了异步编程模型(BeginGetResponseEndGetResponse)。如果您确实希望Smethod_1是异步的,并且想使用Task,则需要包装BeginGetResponseEndGetResponse。有关示例,请参见Interop with Other Asynchronous Patterns