我正在尝试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 检测取消令牌。
答案 0 :(得分:2)
Task
支持合作取消,这意味着如果您要取消已经运行的Task
,Task
内的代码必须支持取消,并且它决定何时会取消取消。实现此目的的方法是将取消令牌传递给方法,并在该方法的代码中的适当位置调用ThrowIfCancellationRequested()
。
如果Task
中的代码不支持取消,则没有干净的方法可以取消或中止。