我在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阻止线程。如果是这样,与上面的同步方法相比,这样做真的有什么好处吗?我是否正确假设处理页面的线程无法处理其他请求,直到此方法完成为止?
答案 0 :(得分:1)
这是一种常见的反模式。你得到两个世界中最糟糕的。没有线程被解除阻塞,你增加了开销。
负责人可能听说使用异步API使他们的应用程序更具可扩展性。如果是这种情况,为什么GetResponse
不会在Begin / End方法中实现,并且始终可以扩展?
Async目前风靡一时,并且一直被滥用,即使正确使用,也常常浪费时间在服务器上。看到这样的东西,不要感到惊讶。