0

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をスローします。

4

1 に答える 1

2

Task■協調キャンセルをサポートします。つまり、Taskすでに実行されているをキャンセルする場合、内のコードはTaskキャンセルをサポートする必要があり、いつキャンセルされるかを決定します。ThrowIfCancellationRequested()これを実現する方法は、キャンセルトークンをメソッドに渡し、そのメソッドのコード内の適切な場所で呼び出すことです。

のコードがTaskキャンセルをサポートしていない場合、キャンセルまたは中止するクリーンな方法はありません。

于 2012-09-14T10:13:44.080 に答える