Vb.net 异步等待超时
我正在编写一个简单的方法来验证网页url是否为真,并返回True或False 在.NET4.5中使用新的AsyncAwait函数现在看起来非常简单,但是如何设置async的超时Vb.net 异步等待超时,vb.net,.net-4.5,async-await,Vb.net,.net 4.5,Async Await,我正在编写一个简单的方法来验证网页url是否为真,并返回True或False 在.NET4.5中使用新的AsyncAwait函数现在看起来非常简单,但是如何设置async的超时 ''' <summary> ''' Returns True if a webpage is valid. ''' </summary> ''' <param name="url">Url of the webpage.</param> Private Async Func
''' <summary>
''' Returns True if a webpage is valid.
''' </summary>
''' <param name="url">Url of the webpage.</param>
Private Async Function VailiateWebpageAsync(url As String) As Task(Of Boolean)
Dim httpRequest As HttpWebRequest
Dim httpResponse As HttpWebResponse
httpRequest = CType(WebRequest.Create(url), HttpWebRequest)
httpRequest.Method = "HEAD" 'same as GET but does not return message body in the response
Try
httpResponse = CType(Await httpRequest.GetResponseAsync, HttpWebResponse)
Catch ex As Exception
httpResponse = Nothing
End Try
If Not IsNothing(httpResponse) Then
If httpResponse.StatusCode = HttpStatusCode.OK Then
httpResponse.Dispose()
Return True
End If
End If
If Not IsNothing(httpResponse) Then httpResponse.Dispose()
Return False
End Function
“”
如果网页有效,则“”返回True。
'''
网页的“”Url。
专用异步函数将WebPageAsync(url作为字符串)作为任务(布尔值)
将httpRequest设置为HttpWebRequest
将httpResponse设置为HttpWebResponse
httpRequest=CType(WebRequest.Create(url),HttpWebRequest)
httpRequest.Method=“HEAD”与GET相同,但不在响应中返回消息体
尝试
httpResponse=CType(等待httpRequest.GetResponseAsync、HttpWebResponse)
特例
httpResponse=无
结束尝试
如果不是空(httpResponse),则
如果httpResponse.StatusCode=HttpStatusCode.OK,则
httpResponse.Dispose()
返回真值
如果结束
如果结束
如果notisnothing(httpResponse),则httpResponse.Dispose()
返回错误
端函数
在拨打电话之前,以毫秒为单位设置超时值:
myHttpWebRequest.Timeout = 1234
详细信息如下。
HttpWebRequest
有一个Timeout
属性,您可以设置:
如果超时,将抛出一个
WebException
,属性设置为timeout
,然后您可以捕获并处理该属性。根据作者的评论,我推测他希望能够对任何异步进行超时。这是我在.NET4上使用的方法,用于获取10秒超时。在.NET 4.5上,语法会略有不同,因为它们将TaskEx
类上的静态方法替换为Task
类
var getUserTask = serviceAgent.GetAuthenticatedUser();
var completedTask = await TaskEx.WhenAny(getUserTask, TaskEx.Delay(10000));
if (completedTask != getUserTask)
{
Log.Error("Unable to contact MasterDataService to retrieve current user");
MessageBox.Show("Unable to contact the server to retrieve your user account. Please try again or contact support.");
Application.Current.Shutdown();
}
此代码将启动
GetAuthenticatedUser
异步任务,但不会保留在该行,因为那里没有Wait
。相反,它移动到下一行并等待getUserTask或10秒延迟。无论哪个先完成,都会导致该行的wait
返回。我们可以通过检查TaskEx.WhenAny
返回的任务
或通过查询getUserTask
并查看其状态来确定是否发生了超时。您需要通过Task.Delay
自己实现超时
注意,异步调用将忽略HttpWebRequest.Timeout
属性。MSDN中明确规定:
==================================
Timeout属性对使用BeginGetResponse或BeginGetRequestStream方法发出的异步请求没有影响
对于异步请求,客户端应用程序实现自己的超时机制。请参阅BeginGetResponse方法中的示例
===========================================这是一个合理的问题答案-但是如何为异步部分设置超时呢?@geo1701如果在
GetResponseAsync
中发生超时,然后您的await
调用将抛出异常,您可以在普通catch块中捕获它-这是async/await
的正常部分,只需在设置方法后立即设置它-它应该自己强制超时。您不需要手动执行此操作。这是解决此问题的合理答案-但是如何为异步部分设置超时?