gpt4 book ai didi

c# - 一致取消 Async CancellationTokenSource 的最佳实践

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

所以我的 UI 上有一个组合框,在 SelectionChanged 上它异步转到 Web 服务以拉回一些要显示在 UI 上的信息(使用新的 C#5 async/await 关键字)。我要做的是在发送新请求之前取消当前的异步请求;例如,如果用户使用键盘快速循环浏览所有组合框项目,则 SelectionChanged 事件可能会在第一个异步请求返回之前触发多次(生成多个异步请求)。

因此,从组合框的 SelectionChanged 事件调用的我的异步函数如下所示:

public async Task<Connections> ConnectionsAsync()
{
return await Task.Factory.StartNew(() => Connections, _cancellationTokenSource.Token);
}

其中 Connections 是关闭并访问 Web 服务的属性。因此,因为一旦取消 CancellationTokenSource 就不能重复使用,所以我正在考虑这样做:

public async Task<Connections> ConnectionsAsync()
{
_cancellationTokenSource.Cancel();
_cancellationTokenSource = new CancellationTokenSource();
return await Task.Factory.StartNew(() => Connections, _cancellationTokenSource.Token);
}

但问题是,有时我会在没有运行异步命令时调用 Cancel()(例如,第一次调用此函数时);因此,如果我连接任何取消事件处理程序,它们将被调用,甚至在我发出异步请求之前。

有没有办法检查异步请求是否已经在运行?除了我做类似的事情:

public async Task<Connections> ConnectionsAsync()
{
if (_runningAsyncCommand)
_cancellationTokenSource.Cancel();
_cancellationTokenSource = new CancellationTokenSource();
_runningAsyncCommand = true;
return await Task.Factory.StartNew(() => Connections, _cancellationTokenSource.Token);
_runningAsyncCommand = false;
}

我有几个异步函数都使用相同的 CancellationTokenSource,所以我必须在所有这些函数中实现这个“管道”。这是最好的方法吗?或者,还有更好的方法?

此外,如果我公开公开 _cancellationTokenSource 以便其他类可以向它注册取消委托(delegate),那么将这些委托(delegate)“转移”到新的 CancellationTokenSource 的最佳方式是什么,因为我每次都创建一个新的?

提前致谢!

最佳答案

看起来像是 Reactive Extensions 的天作之合。定义在创建任务之前从组合框观察事件时必须经过的节流时间(假设为 300 毫秒)

订阅 TextBox 更改事件的代码片段,但您会明白:

var input (from evt in Observable.FromEvent<EventArgs>(txt, "TextChanged")
select ((TextBox)evt.Sender).Text)
.Throttle(TimeSpan.FromSeconds(1))
.DistinctUntilChanged();

using (input.Subscribe(inp => Console.WriteLine("You wrote: " + inp)))
{
// Do stuff
}

关于c# - 一致取消 Async CancellationTokenSource 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11371170/

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