0

我正在 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 。

4

1 回答 1

2

Tasks 支持协同取消,这意味着如果你想取消一个Task已经运行的,里面的代码Task必须支持取消,它决定什么时候取消。实现这一点的方法是将取消标记传递给该方法并ThrowIfCancellationRequested()在该方法的代码中的适当位置调用。

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

于 2012-09-14T10:13:44.080 回答