Tag: 任务 并行库

用于自动取消和重新启动任务的模式

是否有建议的自我取消和重启任务模式? 例如,我正在研究背景拼写检查程序的API。 拼写检查会话被包装为Task 。 每个新会话都应该取消之前的会话并等待其终止(正确地重新使用拼写检查服务提供商等资源)。 我想出了这样的事情: class Spellchecker { Task pendingTask = null; // pending session CancellationTokenSource cts = null; // CTS for pending session // SpellcheckAsync is called by the client app public async Task SpellcheckAsync(CancellationToken token) { // SpellcheckAsync can be re-entered var previousCts = this.cts; var newCts = CancellationTokenSource.CreateLinkedTokenSource(token); this.cts = newCts; […]

取消不接受CancellationToken的异步操作的正确方法是什么?

取消以下内容的正确方法是什么? var tcpListener = new TcpListener(connection); tcpListener.Start(); var client = await tcpListener.AcceptTcpClientAsync(); 简单地调用tcpListener.Stop()似乎会导致ObjectDisposedException ,而AcceptTcpClientAsync方法不接受CancellationToken结构。 我完全错过了一些明显的东西吗

.NET中管理单独(单个)线程上任务队列的最佳方式

我知道异步编程多年来已经发生了很多变化。 我有点尴尬,我让自己在34岁时就生锈了,但我依靠StackOverflow让我加快速度。 我想要做的是在一个单独的线程上管理“工作”队列,但是这样一次只能处理一个项目。 我想在这个线程上发布工作,它不需要将任何东西传递给调用者。 当然,我可以简单地启动一个新的Thread对象并让它在一个共享的Queue对象上循环,使用sleeps,interrupt,wait handle等等。但是我知道事情从那以后变得更好了。 我们有BlockingCollection , Task , async / await ,更不用说可能抽象了很多的NuGet包。 我知道“什么是最好的……”这些问题通常是不受欢迎的,所以我会通过说“目前推荐的是什么……”的方式来改写,最好使用内置的.NET机制。 但是如果第三方NuGet包简化了一堆东西,它也是如此。 我认为一个TaskScheduler实例的固定最大并发性为1,但似乎现在可能没有那么笨重的方法了。 背景 具体来说,我在这种情况下尝试做的是在Web请求期间排队IP地理定位任务。 相同的IP可能会多次排队等待地理定位,但是任务将知道如何检测并尽快跳过,如果它已经解决了。 但请求处理程序只是将这些() => LocateAddress(context.Request.UserHostAddress)调用抛出到队列中,让LocateAddress方法处理重复的工作检测。 我正在使用的地理位置API不喜欢被请求轰炸,这就是为什么我想一次将它限制为单个并发任务。 但是,如果允许通过简单的参数更改轻松扩展到更多并发任务,那将会很好。