【发布时间】:2012-09-07 11:26:29
【问题描述】:
我正在 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 检测取消令牌。
【问题讨论】:
-
你应该使用
CancelAfter方法除了ThrowIfCancellationRequested作为svick回答。
标签: vb.net timeout task-parallel-library async-await