gpt4 book ai didi

c# - 排队 ObservableCollection 更新

转载 作者:太空宇宙 更新时间:2023-11-03 11:31:00 26 4
gpt4 key购买 nike

我正在编写一个 TAPI 应用程序,它使用状态模式来处理 TK 可能处于的不同状态。传入和传出调用通过 ObservableCollection 记录。在ListView (调用日志)。通话数据与存储在 SQL-Server 数据库中的联系人进行比较,以确定可能的匹配项。然后该信息用于更新调用日志。当然,所有这些都是实时的,并且都由 FSM(有限状态机)的不同状态控制/处于不同状态。

为了区分调用,我确实使用了调用 ID(由 TAPI 提供)。当电话响起或我开始打电话时,包括其调用 ID 的新记录将添加到调用日志中,并在客户数据库中搜索该号码,日志中的某些数据会相应更新。在处理不同的调用状态时,应用程序会动态更新日志(即更改直观显示特定调用状态的图标等)。

正是那些对 ObservableCollection 的更新让我头疼,因为它们需要按特定顺序发生。例如,当接到电话时,关联状态将在 ObservableCollection 中创建一个新条目。 .当状态更改时,新状态可能会尝试更新集合,即使天气不清楚要更改的条目是否已经添加。状态碰巧切换得非常快,显然比更新集合要快。

某种消息队列是否是一个可能/好的解决方案?如果是这样,如何在状态机或 ObservableCollection 的上下文中实现这样的消息队列? .我不是在寻找完整的解决方案,但我将不胜感激任何我无法通过 google 或 stackoverflow 轻松找到的信息。

编辑:大大改写了问题。

编辑:我为这个问题添加了自己的解决方案,但会等着看是否有人有更好的主意。

最佳答案

您是否检查过FirstOrDefault 的结果是否为null?如果集合中不存在具有给定 id 的元素,就会发生这种情况。

例如:

var element = this.FirstOrDefault(p => p.ID == id);
if (element != null) {
// Do something with element.Number.
}

或者您可以调用 First 并查看您是否得到 InvalidOperationException

--- 编辑 ---

我从您的评论中看出,您似乎正在同时从多个线程访问同一个 ObservableCollection。如果是这种情况,您需要通过锁定来保护共享数据结构。一个线程完全有可能在另一个线程正在搜索新元素的同时开始插入新元素,从而导致各种未定义的行为。根据MSN documentation for ObservableCollection :

“不保证任何实例成员都是线程安全的。”

至于调试,您可以“卡住”其他线程,这样您就可以只专注于感兴趣的线程,而不会过度“跳转”。查看线程面板、右键菜单、卡住和解冻选项。

关于c# - 排队 ObservableCollection 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7792489/

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