从 BlockingCollection 中获取项目的正确方法是什么?

发布于 2024-11-30 15:48:44 字数 570 浏览 0 评论 0原文

调用 BlockingCollection.Take() 时,集合的 IsCompleted 状态可能会在 IsCompleted 检查和调用 Take() 之间发生变化。

显示示例的 MSDN 文档 只捕获了无效操作异常,但是似乎必须有一种正确的方法来执行这样的调用而不捕获异常(因为这会产生相当大的开销并且在代码中看起来不干净)。调用 .Take() 并避免无效操作异常的正确方法是什么?

我的具体问题的简化版本:

If (!blockingCollection.IsCompleted)
{
//do some stuff
value = blockingCollection.Take();  //Throws Exception, IsCompleted = True;
}

有一个 TryTake 方法可用,但我的印象是,它是为了可以传入超时和取消令牌,而不是处理 IsCompleted 在其之间变为 true检查以及调用 Take() 时。

When calling BlockingCollection.Take() it is possible for the IsCompleted status of the collection to change between the check of IsCompleted and the call to Take().

The MSDN Documentation that shows an example just catches the invalid operation exception, but it seems like there must be a proper way to do such a call without catching the exception (since this incurs a decent amount of overhead and doesn't look clean in code). What is the proper way to call .Take() and to avoid an invalid operation exception?

A simplified version of my specific issue:

If (!blockingCollection.IsCompleted)
{
//do some stuff
value = blockingCollection.Take();  //Throws Exception, IsCompleted = True;
}

There is a TryTake method available, but I am under the impression that it is so that a timeout and cancelation token can be passed in, not to deal with the IsCompleted becoming true in between the time it is checked and when Take() is called.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

春庭雪 2024-12-07 15:48:44

您可以使用没有超时/取消的 TryTake 重载。如果 BlockingCollection 为空或已标记为已完成,它将返回 false,并正确处理您面临的同步问题。

You can use the TryTake overload with no timeout/cancelation. It will return false if the BlockingCollection is empty or has been marked completed, and handles the synchronization issue you're facing correctly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文