异步等待超时

时间:2013-04-16 09:13:36

标签: vb.net .net-4.5 async-await

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

答案 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属性,您可以设置:

MSDN: HttpWebRequest.Timeout

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

答案 2 :(得分:0)

在拨打电话之前,请设置超时值(以毫秒为单位):

myHttpWebRequest.Timeout = 1234

详情为here

答案 3 :(得分:0)

您需要通过Task.Delay自行实施超时。

请注意,异步调用的HttpWebRequest.Timeout属性为 IGNORED 。在MSDN中明确说明:

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

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

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

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