C#: 等待请求在C# 4.5中完成

6

我在我的asp.net 4.0应用程序中有一个http请求。 我希望线程在继续之前等待。

HttpClient client = new HttpClient();
HttpResponseMessage responseMsg = client.GetAsync(requesturl).Result;

// I would like to wait till complete.

responseMsg.EnsureSuccessStatusCode();
Task<string> responseBody = responseMsg.Content.ReadAsStringAsync();

1
你试过使用同步方法(而不是异步)吗? - funerr
这是.NET 4.5 (http://msdn.microsoft.com/de-de/library/system.net.http.httpcontent.readasstringasync(v=vs.110).aspx)。Robert的回答是正确的。 - Sascha
我不太明白你的问题,但如果你调用.result,它应该会阻塞线程直到完成,对吧? - Vincent
4个回答

9

在 responseBody 任务上调用 .Wait() 方法。


3
在4.5版本中(您的标题是这样说的),您可以使用async/await
public async void MyMethod()
{
    HttpClient client = new HttpClient();
    HttpResponseMessage responseMsg = await client.GetAsync("http://www.google.com");

    //do your work
}

要下载一个字符串,你可以简单地使用:
public async void Question83()
{
    HttpClient client = new HttpClient();
    var responseStr = await client.GetStringAsync("http://www.google.com");

    MessageBox.Show(responseStr);

}

2

一种选择是调用 .Wait(),但更好的选择是使用 async

public async void GetData()
{
    using(HttpClient client = new HttpClient())
    {
        var responseMsg = await client.GetAsync(requesturl);
        responseMsg.EnsureSuccessStatusCode();
        string responseBody = await responseMsg.Content.ReadAsStringAsync();
    }
}

}


1

可以使用async关键字await关键字来完成,如下所示:

// Since this method is an async method, it will return as
// soon as it hits an await statement.
public async void MyMethod()
{

    // ... other code ...

    HttpClient client = new HttpClient();
    // Using the async keyword, anything within this method
    // will wait until after client.GetAsync returns.
    HttpResponseMessage responseMsg = await client.GetAsync(requesturl).Result;
    responseMsg.EnsureSuccessStatusCode();
    Task<string> responseBody = responseMsg.Content.ReadAsStringAsync();

    // ... other code ...

}

请注意,await关键字不会阻塞线程。相反,在异步方法的其余部分排队后,控制权将返回给调用者,以便它可以继续处理。如果您需要MyMethod()的调用者也等待client.GetAsync()完成,那么最好使用同步调用。

您可以使用await将responseBody作为字符串检索。您还应该使用using块处理客户端的释放。 - Panagiotis Kanavos
非常好的观点。我猜这就是我发布不完整的代码而没有添加任何内容展示的后果。 - Jon Senchyna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接