2

我正在编写一个简单的方法来验证网页 url 是否真实并返回 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
4

4 回答 4

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。相反,它移动到下一行并等待getUserTask10 秒延迟。无论哪个先完成,都会导致该行await返回。Task我们可以通过检查返回的TaskEx.WhenAny或通过查询getUserTask并查看其状态来确定是否发生超时

于 2013-07-01T18:29:38.793 回答
1

HttpWebRequest有一个Timeout可以设置的属性:

MSDN:HttpWebRequest.Timeout

如果超时,WebException将抛出a 并设置您可以捕获和处理的Status属性。Timeout

于 2013-04-16T09:16:29.777 回答
0

在进行调用之前,以毫秒为单位设置超时值:

myHttpWebRequest.Timeout = 1234

详情在这里

于 2013-04-16T09:16:27.823 回答
0

您需要通过自己实现超时Task.Delay

请注意,对于异步调用,该HttpWebRequest.Timeout属性被忽略。在 MSDN 中有明确的说明:

====================================

Timeout 属性对使用 BeginGetResponse 或 BeginGetRequestStream 方法发出的异步请求没有影响。

在异步请求的情况下,客户端应用程序实现自己的超时机制。请参阅 BeginGetResponse 方法中的示例。

====================================

于 2013-11-05T18:48:38.527 回答