gpt4 book ai didi

c# - 使用一次性对象的回调取消操作的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-30 12:21:48 28 4
gpt4 key购买 nike

我正在努力将 Controller 移植到异步。部分工作涉及使用在请求生命周期内有效的取消 token ,等待对一次性对象执行异步、可取消的操作。在这种特殊情况下,它是 WebClient.UploadStringTaskAsync(Uri uri, string data)

我知道使用 cancellationToken.Register(() => webClient.CancelAsync()) 取消 WebClient 异步操作的正确方法。但是,WebClient 是在 using 语句中创建的,因此它被放置在 block 的末尾。因此,从回调中调用 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.

我已经制作了一个控制台应用程序来展示具有相同精神的代码的工作原理,并且在处理完一次性对象和 token 注册后取消 token 不会导致调用一次性对象的回调。不过,我想确定:这是否正确且安全?

编辑:我想我应该稍微改一下我的问题。使用取消 token 取消一次性对象上的异步操作的标准解决方案是什么,该操作仅支持通过注册回调进行取消?

最佳答案

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。在这种情况下,您已有的方法就可以了。

关于c# - 使用一次性对象的回调取消操作的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43902015/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com