0

async現在呼び出されているキャンセルできるようにしたいメソッドがあります

        string html = await Html.WebClientRetryAsync(state);

CancellationToken を渡してこのメ​​ソッドを呼び出すことができる構文を理解しようとしています。これが私がこれまでに試みたことです。

        CancellationToken ct;
        Func<object, Task<string>> func = async (s) => await WebClientRetryAsync((string)s);
        Task<Task<string>> task = Task<Task<string>>.Factory.StartNew(func, state.Uri.AbsoluteUri, ct);
        string html = await task.Result;

先に進む前に、メソッド内でキャンセルが要求されたかどうかを確認する予定です。ドキュメントに例が見つかりませんでした

私が持っているものはWebClientRetryAsyncメソッドへのトークンを取得しないため、これは機能しません。

4

1 に答える 1

2

基礎となる非同期メソッドがキャンセルをまったくサポートしていない場合は、それをキャンセルする方法はありません。それは、キャンセルできない非同期操作をキャンセルするにはどうすればよいですか? . キャンセル トークンがキャンセルされた後もコードを実行し続けることはできますが、基になる非同期操作に停止するように指示する方法がない場合、それを停止する方法はありません。

タイムアウトに達したと仮定して、タスクが終了したときに先に進む方法が必要な場合は、これらの拡張メソッドを使用してその機能を追加できます。

public static Task AddCancellation(this Task task, CancellationToken token)
{
    return Task.WhenAny(task, task.ContinueWith(t => { }, token))
        .Unwrap();
}
public static Task<T> AddCancellation<T>(this Task<T> task, 
    CancellationToken token)
{
    return Task.WhenAny(task, task.ContinueWith(t => t.Result, token))
        .Unwrap();
}

もちろん、awaitこのような呼び出しの結果でタスクがキャンセルされた場合、例外がスローされることを認識してください。これは、そのパスをサポートする方法です。

于 2013-12-12T20:47:12.387 に答える