如何在另一种方法

时间:2015-10-28 13:25:13

标签: c# async-await

所以我试图从网址中获取源代码,这是我的代码:

public async Task<string> grabPageHtml(Uri pageUrl)
{
    var request = WebRequest.Create(pageUrl) as HttpWebRequest;
    request.Method = "GET";
    WebResponse responseObject = await Task<WebResponse>.Factory.FromAsync(
                                        request.BeginGetResponse,
                                        request.EndGetResponse, request);

    var responseStream = responseObject.GetResponseStream();

    var sr = new StreamReader(responseStream);
    received = sr.ReadToEndAsync().Result;      
    return received;
} 

代码正常工作并返回源代码。问题是在另一个方法中将“received”分配给字符串变量。

试过这个:

string pageHtml = grabPageHtml(pageUrl)

但是pageHtml将System.Threading.Tasks.Task'1[System.String]输出到控制台而不是源代码。

1 个答案:

答案 0 :(得分:3)

  

pageHtml输出System.Threading.Tasks.Task1 [System.String]`到   控制台而不是源代码。

这是因为您的方法返回Task<string>,而不是string。你需要以某种方式提取字符串结果。它应该是:

public async Task FooAsync()
{
    string pageHtml = await GrabPageHtmlAsync(pageUrl);
    Console.WriteLine(pageHtml);
}

作为旁注,不要阻止异步代码。使用Task.Result可能会导致死锁。此外,使用HttpClient会使您的代码更清晰,无需调用FromAsync

public Task<string> GrabPageHtmlAsync(Uri pageUrl)
{
    var httpClient = new HttpClient();
    return httpClient.GetStringAsync(pageUrl);
}