Я пробую Async/Await в 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.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. - person Stephen Cleary   schedule 14.09.2012