我有一个 PropertyGrid 在我的应用程序,用于编辑的任意的对象。我需要能够运行一个任意的子程序在另一个线程上,看起来也在这些对象(搜索功能,如果你好奇的).显而易见的问题是,用户可以编辑这些目的同时,我的搜索线阅读它,这将是可取的,以避免(尽管它可能不会导致任何东西至关重要的因为我的搜索线只读,不写)。

lock(obj) 足够容易从我搜索线,但是之后希望通过文件和简要脱脂通过PropertyDescriptorGridEntry码在反射器,我似乎无法找到类似地点使用 System.Threading.Monitor.Enter()/Exit() 呼吁的对象问题上PropertyGrid.我希望会有BeginEdit和EndEdit活动,这将使这个足够简单,但我似乎找不到任何这样的事情。我不锁整个的对象,而它是在显示在PropertyGrid作,显然会阻止我的搜索线,直到另一目的是选择。

我是一位新的螺纹型的Windows的形式,所以我希望有些答案很明显我刚刚被忽视。任何帮助吗?

编辑: 同步性克隆我的目前运行的搜索异步将可能是无效率的足够的,我也可以运行搜索本身同步-这一点的运行异步当然是要让我的用户继续工作,同时搜寻是执行。搜索需要规模以及,作为数据设置,我要通过将最终结束被任意大,这使得同步的克隆的看起来像它将导致可用性问题,我试图避免的。

有帮助吗?

解决方案

我想你将不得不做相当多的工作,为这一点。

首先,你必须创建ICustomTypeDescriptor的实现这将立足于任何TypeDescriptor你通常会得到该类型的实施。

然后,在其中的暴露要锁定的部件的描述符的方法的实施方式中,你将提供从那些描述符导出子类并重写适当的方法来绕到一个锁。

因此,对于一个属性,你将实施的GetProperties来回报您的PropertyDescriptor的具体子类。这些子类将重写的GetValue和方法的SetValue(和其他),并访问这些变量时使用锁。

应该提到的是,在UI线程锁定像这可能是一个糟糕的主意,因为你不想随意阻止在该线程操作。这可能是最好只创建对象的副本,然后有当您完成哪些更新对象的商店的方法。

其他提示

这将的确不是线程安全的。你可以当元帅的搜索代码到UI线程的位,但将放慢改革的步伐,也许击败穿线的点...

有多快搜索需要是什么?你可以针对克隆工作?等

你能显示它之前复制的数据,让您的搜索线程的克隆工作?如果你想搜索的线程来“看”的变化,你可以对PropertyGrid事件作出反应,或许会让控制的莫名其妙的变化的克隆。 (它可能更容易只需要使用“过时”的数据,虽然。)

我知道克隆数据听起来可怕低效的,但肯定穿线简单当每个线程的工作原理上完全独立的数据(或所有线程只读)。

我可能是错的,但在我看来,你来自错误的结束。

有两个不同的问题你需要地址。

首先,确保PropertyGrid是唯一曾经访问上UI线。如果任何其方法(包括酒店吸气/者)进行访问的其他线,你会痛苦的以神秘的方式。例外的是 InvokeRequired()Invoke, 当然.

其次,确保你的搜索线可以正常运行。

为了解决第一个问题, 要么 确保你的对象是永远不会改 除了 由UI线, 让你的所有事件触发线程知道这样你的对象的事件(例如引发)是永远只能触发UI上的螺纹。

第二个问题是容易的-只要你搜索线只读自己的核心对象,一切都应该做工精细。是的,你的搜索线可能会无意中看到的某些部分更新的数据,但是,真正的问题?

几个最后的想法...

  • 不执行搜索,以迭代过PropertyGrid本身;获得一个名单的对象前面(他们不需要克隆)和工作的通过,代替。

  • 你有没有考虑使用空闲的处理做搜索?的 Application 象火灾事件,每次的应用程序的消息的过程-你可以勾到这一点,并执行步骤1的搜索每一次事件是解雇。样的一个穷人穿的,但是没有互斥/锁/semaphone头痛。我用这个非常好的效果在过去。

更新:如果我记忆正确的话,PropertyGrid尊重 IEditableObject 接口,叫 BeginEdit 尽快开始修改行, EndEdit 当你移动到不同行。你可以利用这个以防你的搜索线从看到的不完整的变化。

更新2:下面,我发现了什么你已经知道-这PropertyGrid 不不 尊重ieditableobject,则接口。

我有另一项建议,虽然它可能被更多的工作比你想投资。

当时的系统。交易名称空间是介绍。网2.0的,我看到了一篇关于使用环境事务提供线隔离的对象。这个想法是你的目的具有双重性质的储存。第一你有所致力的价值,可见到的所有线程,并且你有一个线程的地方变量,用于储存未提交的价值对每一个线程的基础。当一个属性修改,对象登记在任何环境事务储存的新价值的线的地方。当交易承诺或卷回,价值的线或者储存或丢弃。

不幸的是,我找不到原来的文章,虽然它看来,里昂证券提供这种支持。希望这会有所帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top