作为问题,我有 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/