gpt4 book ai didi

asp.net - 4.5 中的异步 : Cancellation and Timeout

转载 作者:行者123 更新时间:2023-12-02 17:52:47 25 4
gpt4 key购买 nike

我在 HTTPHandler 中有一个长时间运行的进程,我使用 Async Await .net 4.5 异步执行该进程

这完全符合预期......

如何添加超时,以便在进程花费太长时间时返回字符串“timeout”?

Protected Async Sub button1_Click(sender As Object, e As System.EventArgs)
Dim asyncHandler = New AsyncHandler
Await asyncHandler.ProcessRequestAsync(HttpContext.Current)
Response.Write(asyncHandler.Result)
End Sub

Public Class AsyncHandler
Inherits HttpTaskAsyncHandler

Public Property Result As String

Public Async Function ProcessRequestAsync(context As HttpContext) As Task
Me.Result = Await DoLongRunningProcessAsync(context)
End Function

Private Function DoLongRunningProcessAsync(context As HttpContext) As Task(Of String)

'TODO: add a timeout so that if this takes too long we return "timeout":

Return Task.Run(Of String)(Function() DoLongRunningProcess(context))

End Function

Private Function DoLongRunningProcess(context As HttpContext) As String
'perform long running process....

Return "success"
End Function

End Class

最佳答案

这是我最终实现的:

创建了一个超时值为 x 毫秒的 CancellationToken

添加了 try catch 来捕获错误:OperationCanceledException

Public Async Function ProcessRequestAsync(context As HttpContext) As Task
Dim cts As CancellationTokenSource = New CancellationTokenSource(30000) 'eg: 30 seconds
Try
Me.ResultCode = Await DoLongRunningProcessAsync(HttpContext.Current, cts.Token)
Catch ex As OperationCanceledException
Me.ResultCode = "timeout"
End Try
End Function

将 CancellationToken 传递给 DoLongRunningProcessAsync 方法的签名

通过调用 ThrowIfCancellationRequested 检测超时

Private Function DoLongRunningProcessAsync(context As HttpContext, ct As CancellationToken) As Task(Of String)
Return Await Task.Run(Of String)(
Function()
Dim resultCode As String = DoLongRunningProcess(context)

'detect timeout:
ct.ThrowIfCancellationRequested()

Return resultCode
End Function)
End Function

这是我发现确实有帮助的一篇很棒的文章:

Async in 4.5: Enabling Progress and Cancellation in Async APIs

关于asp.net - 4.5 中的异步 : Cancellation and Timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16043254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com