【发布时间】:2010-02-26 20:53:22
【问题描述】:
我正在编写一个显示对象列表的应用程序,用户可以选择这些对象列表,然后通过 PropertyGrid 控件查看和编辑其属性。通过使用辅助线程从文件中提取信息的耗时过程填充对象的属性。但我还希望允许用户在提取过程进行时继续查看其他对象。
阅读对 SO 上的my previous 问题的回复后。这听起来像是因为提取过程正在写入的属性不与用户通过属性网格编辑的属性相交,我不应该对同时编辑对象的两个线程有问题。虽然如果用户非常不幸并且属性网格最终在非原子写入中间读取对象,则用户可能会看到不正确的值。
但是,我仍然想知道如何设置它以防止用户编辑或查看正在被提取的对象。我对多线程非常陌生,但是我读过的大多数示例都显示了一个单独的令牌对象被创建用于锁定对实际感兴趣对象的访问。我的另一个previous question 的答案证实,通常会创建一个像这样专门用于锁定的单独对象。
所以现在我想知道的是,在我拥有大量对象的情况下如何处理?我想创建锁,以防止属性网格显示用户选择的对象(如果它当前被提取到)。
我是否需要创建一个单独的锁定对象集合以与我的真实集合保持同步?因此,如果从我的主集合中添加或删除一个对象,我必须从我的锁定集合中添加或删除锁定对象?
我是否锁定到实际对象而不是创建单独的令牌锁定对象?
向属性网格可以检查对象是否正在写入的对象添加“IsBeingExtracted”布尔属性怎么样?这将在提取过程的最开始和最结束时设置。
或者在某处引用当前正在提取的当前(如果有)对象的静态字段怎么样。然后属性网格可以检查它被要求显示的最新对象不是这个静态字段引用的对象吗?如果有多个提取线程,这当然行不通。
最好/正确的方法是什么?我个人最喜欢布尔属性选项,但想知道其他真正知道自己在做什么的人的想法。
【问题讨论】:
标签: c# winforms multithreading locking propertygrid