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