如何在另一个方法的变量中收集等待的方法的返回值

本文关键字:方法 等待 返回值 变量 另一个 | 更新日期: 2023-09-27 18:19:33

所以我试图从url中获取源代码,下面是我的代码:

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向控制台输出CCD_ 1而不是源代码。

如何在另一个方法的变量中收集等待的方法的返回值

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);
}