簡體   English   中英

在任務中發送取消令牌<TResult>

[英]Sending a Cancellation Token in a Task<TResult>

我有一個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方法的令牌,所以這不起作用。

如果底層的異步方法根本不支持取消,那么就沒有任何方法可以取消它,就像我如何取消不可取消的異步操作中所討論的那樣? 取消令牌取消后,您可以讓代碼繼續執行,但如果底層異步操作無法被告知它應該停止,則無法停止它。

如果您只想在任務完成時想要一種移動方式,假設已達到超時,那么您可以使用這些擴展方法來添加該功能:

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這樣的調用結果並且任務被取消,它將拋出異常,這就是你支持該路徑的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM