c# - 正在为 C# 中的新任务处理免费资源

标签 c# list task

作为问题,我有 2 个或更多任务(使用 Task.Run 每次创建新任务)顺序访问相同的对象(主要是列表),我想做的是前一个任务将释放资源,以便后面的人可以访问。处理我的对象的操作是一个长时间运行的操作(访问数据库),因此我不想使用 Task.Wait()。我尝试使用 CancellationTokenResource 但它对我不起作用,因为任务仍在运行并持有对象。关于我应该如何实现这一点有什么建议吗?

最佳答案

首先关闭Task取消是合作的,这意味着处理任务必须定期检查是否已请求取消并相应地终止。不这样做可能是您尝试使用 CancellationToken 的原因失败了。

也就是说,听起来您正在尝试解决(或者甚至可能完全是)生产者-消费者 问题的变体。如果是这样,强烈考虑使用 BlockingCollection<T> 类,因为它处理所有边缘情况并提供一个非常简单的界面。生产者只需调用Add :

myBlockingCollection.Add(item);

消费线程使用GetConsumingEnumerable :

foreach (var item in myBlockingCollection.GetConsumingEnumerable())
{
}

当所有生产者都完成后,调用 CompleteAdding让消费线程终止。

关于c# - 正在为 C# 中的新任务处理免费资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43130573/

相关文章:

c# - 创建实体时发现重复记录错误

c# - 访问多个数据库的多个解决方案

C# 将 Split() 与列表一起使用?

c# - 如何处理进行中的任务

python - 生产者和 worker (python)的任何本地任务队列(可能是磁盘队列或内存队列?)?

c# - 如何使用C#删除USB驱动器

c# - Async/Await 最大并发 http 请求数

python - 根据另一个列表对 python 列表进行排序

c++ - 洗牌 QStringList 中的元素

.net - 如何监视 .NET TaskScheduler 中的任务队列(跨 AppDomain)