我们有一个标准的生产者消费者实现,其中 BlockingCollection 与任务一起使用。
使用阻塞集合上的 GetConsumingEnumerable() 完成项目的消耗,然后在消费者线程上使用 RunSynchronously() 执行每个任务。
这对我们来说很好,但现在一些任务不是很短命,而是与后端 Web 服务对话。
所以问题是,以这种方式完成执行长时间运行活动的任务是否可以接受,或者这会消耗更多资源并且从块集合中获取的循环需要以某种方式调整以使用延续?如果它不在循环中,那么我将始终对这些操作使用延续。
当前代码看起来像
foreach(var task in _Queue.GetConsumingEnumerable())
{
if (!task.IsCanceled)
{
task.RunSynchronously();
}
}
鉴于我们也是针对的平台,使用 async await 是不可能的。