gpt4 book ai didi

c# - 如何等到值添加到 ConcurrentDictionary 或发生超时?

转载 作者:太空狗 更新时间:2023-10-29 23:46:50 28 4
gpt4 key购买 nike

我有一个任务应该等到一个值被添加到 ConcurrentDictionary。如果添加了值,它应该停止等待并继续其工作。如果发生超时(例如 5 秒),它也应该停止等待。

值应该由另一个线程/任务添加到 ConcurrentDictionary,但是,由于代码的性质,我不希望线程相互通信。

我应该如何着手实现它(在 C# 中)?

顺便说一句,我大部分时间都在使用任务,而不是线程,因此我不确定当前线程上的 Thread.Sleep 或其他方法是否是一个好的决定,因为它可能会休眠其他使用相同任务的任务线程并导致随机问题。

最佳答案

我认为“等待”元素添加到集合中通常是一件坏事。一般来说,这样做意味着线程被阻塞了一段时间。如果可能的话,您就必须处理超时。如果无法检测到超时,那么您必须处理中止线程以中止等待(您永远不想陷入线程被无限期阻塞的情况),例如取消。

ConcurrentDictionary 本身是线程安全的;但这并不能使使用ConcurrentDictionary所有 代码成为线程安全的。使用 ConcurrentDictionary 对象时,仍需要考虑特定于应用程序的线程安全要求。 ConcurrentDictionary 不可能实现这些类型的东西。当一个值被添加到字典时要做什么也非常相似——在添加新值时等待或通知外部代码的开销会导致 ConcurrentDictionary 的所有使用都变慢,即使那些使用不需要等待或不需要被通知——所以类似的事情没有实现。应用程序添加一个值并且需要被通知一个值被添加的事实可能是非常罕见的(从字典的角度来看,为什么它会告诉you you 刚刚添加了一个值...)。因此,这种特定于应用程序的事情通常是在应用程序级别完成的。即使用并发字典的事实是巧合,您的应用程序通知其他线程另一个线程已经完成了他们需要知道的事情。这可能意味着通过调用 ManualResetEventSlim.Reset/Set 将添加包装到字典实例中,并且某些东西可以通过 ManualResetEventSlim.Wait 覆盖等待。或者,这可能只是编写一个事件,每当向字典中添加一个值时都会引发该事件。

关于c# - 如何等到值添加到 ConcurrentDictionary 或发生超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14608820/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com