我正在努力将控制器移植到异步。部分工作涉及使用取消令牌等待对一次性对象的异步,可取消操作,该取消令牌对请求的生命周期有效。在这种特殊情况下,它是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.
我已经创建了一个控制台应用程序来显示具有相同精神的代码,并且在处理了一次性对象和令牌注册后取消令牌不会导致调用一次性对象的回调。我想确定一下:这是正确和安全吗?
编辑:我想我应该稍微改一下我的问题。使用取消令牌取消对一次性对象的异步操作的标准解决方案是什么,其中操作仅通过注册回调来支持取消?
答案 0 :(得分:2)
这是正确和安全的吗?
是
使用取消令牌取消对一次性对象的异步操作的标准解决方案是什么,其中操作仅通过注册回调来支持取消?
理想情况下,操作直接采用CancellationToken
。在这种情况下,你已经采用的方法很好。