我正在编写一个简单的方法来验证网页网址是否真实,并返回True或False。
在.NET 4.5中使用新的异步等待函数现在看起来非常容易,但是如何为异步设置超时?
''' <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
答案 0 :(得分:2)
根据作者的评论,我认为他希望能够超时任何异步。这是我在.NET 4上使用的方法,获得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
异步任务,但不会保留该行,因为那里没有await
。相反,它移动到下一行并等待 getUserTask或10秒延迟。无论哪个先完成,都会导致该行await
返回。我们可以通过检查Task
返回的TaskEx.WhenAny
或查询getUserTask
并查看其状态
答案 1 :(得分:1)
HttpWebRequest
有一个Timeout
属性,您可以设置:
如果超时超时,将WebException
抛出Status
属性设置为Timeout
,然后您可以捕获并处理。
答案 2 :(得分:0)
答案 3 :(得分:0)
您需要通过Task.Delay
自行实施超时。
请注意,异步调用的HttpWebRequest.Timeout
属性为 IGNORED 。在MSDN中明确说明:
==================================
Timeout属性对使用BeginGetResponse或BeginGetRequestStream方法进行的异步请求没有影响。
在异步请求的情况下,客户端应用程序实现自己的超时机制。请参阅BeginGetResponse方法中的示例。
==================================