在 .NET 4.5 中使用 await 使任务超时



我正在 VB.NET 4.5 中尝试异步/等待,并希望我的任务如果在特定时间段内未完成,则超时。我有

Await Task.Run( Sub() PerformSomeAction() )

这似乎很整洁。我还看到有一种形式的Task.Run需要取消令牌。如果出现超时,如何使用它取消任务?

编辑

我有以下原型解决方案

    Dim cts = New CancellationTokenSource()
    Dim ct As CancellationToken = cts.Token
    Dim delay = Task.Delay(1000)
    Dim completed = Await Task.WhenAny(Task.Run(Sub() PerfomSomeAction(ct), ct), delay)
    If completed Is delay Then
            cts.Cancel()
    End If

这看起来很嘈杂的代码。这样好吗?另一个想法是处理超时作为例外并使用 CTS。取消之后。像这样的东西??

    Dim cts = New CancellationTokenSource()
    Dim ct As CancellationToken = cts.Token
    try
        cts.CancelAfter(1000) 'ms
        Dim completed = Task.Run(Sub() PerformSomeAction(ct), ct)
    catch SomeTimeoutException
    end try

并在执行某些操作中,如果我得到检测取消令牌。

Task支持

合作取消,这意味着如果要取消已经在运行的TaskTask中的代码必须支持取消,并决定何时取消。实现此目的的方法是将取消令牌传递给该方法,并在该方法代码中的适当位置调用ThrowIfCancellationRequested()

如果Task中的代码不支持取消,则没有干净的方法来取消或中止它。

相关内容

  • 没有找到相关文章