[英]What's the correct way to cancel an operation with a callback on a disposable object?
我正在努力將控制器移植到異步。 部分工作涉及使用取消令牌等待對一次性對象的異步,可取消操作,該取消令牌對請求的生命周期有效。 在這種特殊情況下,它是WebClient.UploadStringTaskAsync(Uri uri, string data)
。
我知道使用cancellationToken.Register(() => webClient.CancelAsync())
取消WebClient的異步操作的正確方法。 但是, WebClient
是在using語句中創建的,因此它位於塊的末尾。 因此,從回調中調用webClient.CancelAsync()
導致“訪問置位關閉”警告。 我發現CancellationToken.Register(Action callback)
導致CancellationTokenRegistration
對象實現IDisposable
並在處理時取消注冊回調。 最后,我的代碼看起來像:
using (var webClient = new WebClient())
using (cancellationToken.Register(() => webClient.CancelAsync())
{
await webClient.UploadStringTaskAsync(uri, data);
}
// cancellationToken can be cancelled later.
我已經制作了一個控制台應用程序,以顯示具有相同精神的代碼工作,並且在處理了一次性對象和令牌注冊后取消令牌不會導致調用一次性對象的回調。 我想確定一下:這是正確和安全的嗎?
編輯:我想我應該稍微改一下我的問題。 使用取消令牌取消對一次性對象的異步操作的標准解決方案是什么,該操作僅通過注冊回調來支持取消?
這是正確和安全的嗎?
是。
使用取消令牌取消對一次性對象的異步操作的標准解決方案是什么,該操作僅通過注冊回調來支持取消?
理想情況下,操作直接采用CancellationToken
。 在這種情況下,您已經擁有的方法很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.