VB.NET4.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
これはかなりうるさいコードに見えます。これはいいですか?もう1つのアイデアは、タイムアウトを例外として処理し、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をスローします。