Vb.net 异步等待超时

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

我正在编写一个简单的方法来验证网页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 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
的正常部分,只需在设置方法后立即设置它-它应该自己强制超时。您不需要手动执行此操作。这是解决此问题的合理答案-但是如何为异步部分设置超时?