我正在努力将控制器移植到异步.部分工作涉及使用取消令牌等待对一次性对象的异步,可取消操作,该取消令牌对请求的生命周期有效.在这种特殊情况下,它是WebClient.UploadStringTaskAsync(Uri uri,字符串数据).
我知道使用cancellationToken.Register(()=> webClient.CancelAsync())取消WebClient的异步操作的正确方法.但是,WebClient是在using语句中创建的,因此它位于块的末尾.因此,从回调中调用webClient.CancelAsync()会导致“访问置位关闭”警告.我发现CancellationToken.Register(Action回调)导致CancellationTokenRegistration对象实现IDisposable并在处理时取消注册回调.最后,我的代码看起来像:
using (var webClient = new WebClient())
using (cancellationToken.Register(() => webClient.CancelAsync())
{
await webClient.UploadStringTaskAsync(uri, data);
}
// cancellationToken can be cancelled later.
我已经制作了一个控制台应用程序,以显示具有相同精神的代码工作,并且在处理了一次性对象和令牌注册后取消令牌不会导致调用一次性对象的回调.我想确定一下:这是正确和安全的吗?
编辑:我想我应该稍微改一下我的问题.使用取消令牌取消对一次性对象的异步操作的标准解决方案是什么,该操作仅通过注册回调来支持取消?
最佳答案
Is this correct and safe?
是.
What’s the standard solution for using a cancellation token to cancel an async operation on a disposable object where the operation only supports cancellation through registering a callback?
理想情况下,操作直接采用CancellationToken.在这种情况下,您已经拥有的方法很好.