使用HttpWebRequest.BeginGetRequest与AsycnWaitHandle.WaitOne()的任何优势

时间:2014-05-18 04:18:29

标签: asp.net asynchronous httpwebrequest

我在ASP.NET应用程序中运行了一些代码,并且我想知道以下两个代码段之间是否存在任何实际差异。请注意,我们正在尝试向第三方端点发送请求,然后在页面上呈现的内容中使用响应。

Dim asyncResult As IAsyncResult = request.BeginGetResponse(Nothing, Nothing)
asyncResult.AsyncWaitHandle.WaitOne()

Using webResponse As WebResponse = request.EndGetResponse(asyncResult)
    Using rd As StreamReader = New StreamReader(webResponse.GetResponseStream())
        'code here
    End Using
End Using

和这个同步版本:

Using webResponse As WebResponse = request.GetResponse()
    Using rd As StreamReader = New StreamReader(webResponse.GetResponseStream())
        'code here
    End Using
End Using

根据this answer to another question,WaitOne阻止线程。如果是这样,与上面的同步方法相比,这样做真的有什么好处吗?我是否正确假设处理页面的线程无法处理其他请求,直到此方法完成为止?

1 个答案:

答案 0 :(得分:1)

这是一种常见的反模式。你得到两个世界中最糟糕的。没有线程被解除阻塞,你增加了开销。

负责人可能听说使用异步API使他们的应用程序更具可扩展性。如果是这种情况,为什么GetResponse不会在Begin / End方法中实现,并且始终可以扩展?

Async目前风靡一时,并且一直被滥用,即使正确使用,也常常浪费时间在服务器上。看到这样的东西,不要感到惊讶。