【问题标题】:Under what circumstances can ConcurrentBag.TryTake() fail?ConcurrentBag.TryTake() 在什么情况下会失败?
【发布时间】:2011-01-06 10:52:43
【问题描述】:

我正在考虑在我正在编写的程序中使用ConcurrentBag,但是我似乎无法在TryTake 上找到足够的文档。

我了解该方法可能会失败,但我无法解释可能发生此类失败的情况,以及失败后集合将处于什么状态。

如果只是在另一个线程已经删除该项目的情况下,那么我不在乎,但我真正负担不起的是我想要删除的项目在调用后仍然在集合中。

会是这样吗?

【问题讨论】:

  • 一些代码(失败)和你得到的异常细节会有所帮助!
  • @decyclone,他没有失败的代码,他在问 TryTake 方法在什么情况下会失败,失败后集合的状态是什么。

标签: c# .net collections concurrency


【解决方案1】:

如果没有可取的物品,即袋子是空的,则从文档中返回 false。由于它是一个线程安全的集合,因此“空”和多线程应该没有问题。

您必须考虑result Treturn value 的文档:

result T:该方法返回时,result包含从ConcurrentBag中取出的对象,如果bag为空,则为T的默认值。

返回:如果对象被成功删除,则返回 true;否则为假。

http://msdn.microsoft.com/en-us/library/dd287255.aspx

【讨论】:

  • 遗憾的是,文档没有涵盖任何例外情况,例如“无法访问已处置的对象”。
【解决方案2】:

鉴于您正在处理多线程,在 TryTake 决定返回 false(并将其设置为 return default(T)) 的值,以及对 TryTake 的调用实际返回到您的代码的时刻。

所以当你能够处理错误的结果时,袋子里可能真的有一件物品。

【讨论】:

  • 谢谢,但所涉及的代码只是确保每个用户只使用某个资源一次,因此如果用户决定在不久之后发送注销然后登录并且出于某种原因这两个碰巧几乎同时处理,这不是担心的理由。然而,无法注销或不正确的注销处理将是一个问题,因此是个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多