作为问题,我有两个或更多任务(每次使用Task.Run
创建新任务)顺序访问相同对象(主要是List),我想要做的是前一个任务将释放资源以便后者可以访问。处理我的对象的操作是一个长期运行的操作(访问数据库),所以我不想使用Task.Wait()
。我尝试使用CancellationTokenResource
但它对我不起作用,因为任务仍在运行并保存对象。关于我应该做些什么的任何建议?
答案 0 :(得分:3)
首先取消Task
取消是合作,这意味着处理任务必须定期检查是否已请求取消并相应地终止。不这样做可能是您尝试使用CancellationToken
失败的原因。
那就是说,听起来你正试图解决生产者 - 消费者问题的变异(或者甚至可能正好)。如果是这样,强烈考虑使用BlockingCollection<T>
类,因为它处理所有边缘情况并提供非常简单的界面。制作人只需致电Add
:
myBlockingCollection.Add(item);
消费线程使用GetConsumingEnumerable
:
foreach (var item in myBlockingCollection.GetConsumingEnumerable())
{
}
完成所有生成器后,调用CompleteAdding
让消费线程终止。