为C#中的新任务处理空闲资源

时间:2017-03-31 00:39:38

标签: c# list task

作为问题,我有两个或更多任务(每次使用Task.Run创建新任务)顺序访问相同对象(主要是List),我想要做的是前一个任务将释放资源以便后者可以访问。处理我的对象的操作是一个长期运行的操作(访问数据库),所以我不想使用Task.Wait()。我尝试使用CancellationTokenResource但它对我不起作用,因为任务仍在运行并保存对象。关于我应该做些什么的任何建议?

1 个答案:

答案 0 :(得分:3)

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

那就是说,听起来你正试图解决生产者 - 消费者问题的变异(或者甚至可能正好)。如果是这样,强烈考虑使用BlockingCollection<T>类,因为它处理所有边缘情况并提供非常简单的界面。制作人只需致电Add

myBlockingCollection.Add(item);

消费线程使用GetConsumingEnumerable

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

完成所有生成器后,调用CompleteAdding让消费线程终止。