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

时间:2012-09-14 09:51:11

标签: vb.net timeout task-parallel-library async-await

我正在尝试VB.NET 4.5中的Async / Await,并希望我的任务 如果在一定时间内没有完成,则超时。我有

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.CancelAfter。像这样的东西?

    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

并且使用PerformSomeAction如果我得到了,我会抛出SomeTimeoutException 检测取消令牌。

1 个答案:

答案 0 :(得分:2)

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

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