我知道异步编程多年来已经发生了很多变化。我有点尴尬,我才34岁就让自己变得这么生疏,但我指望 StackOverflow 帮助我跟上潮流。
我想做的是在一个单独的线程上管理“工作”队列,但只处理一个项目。我想在此线程上发布工作,而且不需要将任何东西传回给调用者。当然,我可以简单地启动一个新的 Thread
对象并让它循环使用共享的 Queue
对象,使用睡眠、中断、等待句柄等等。但我知道事情已经变得更好了。我们有 BlockingCollection
、Task
、async/await
,更不用说可能抽象了很多的 NuGet 包。
我知道“最好的...”这样的问题通常会被人所反感,所以我会重新表述一下,“当前推荐的...”用内置 .NET 机制进行此类操作的方法。但是如果第三方的 NuGet 包能够简化很多事情,那也一样好。
我考虑过使用固定最大并发数为1的 TaskScheduler
实例,但现在可能有更简洁的方法。
背景
具体来说,在这种情况下我想要做的是在 Web 请求期间排队 IP 地理位置任务。相同的 IP 可能会多次被排队进行地理定位,但是任务将会知道如何检测并且如果已经解决了就尽早跳过它。但请求处理程序只会把这些 () => LocateAddress(context.Request.UserHostAddress)
调用扔进队列中,然后让 LocateAddress
方法来处理重复工作的检测。我使用的地理位置 API 不喜欢遭受大量请求,这就是为什么我想将它限制在同时进行单个任务。但是,如果可以通过简单的参数更改轻松地扩展到更多并发任务,则很好。
BlockingCollection
。听起来像是一个简单的生产者/消费者问题。 - Zer0BlockingCollection
对于异步的情况非常有效。让我写一个例子。 - Zer0AsyncContext
/AsyncContextThread
。 - Stephen Cleary