我的应用程序中有一个PropertyGrid
用于编辑任意对象。我需要能够在另一个查看这些对象的线程上运行任意子例程(搜索功能,如果你好奇的话)。显而易见的问题是,用户可能在我的搜索线程正在读取其中一个对象的同时正在编辑它,最好避免这种情况(尽管它可能不会导致任何关键问题,因为我的搜索线程只是在读取,不写)。
从我的搜索线程中调用lock(obj)
很容易,但是在浏览了文档并简要浏览了 Reflector 中的 PropertyDescriptorGridEntry 代码后,我似乎找不到类似的位置来System.Threading.Monitor.Enter()/Exit()
调用 PropertyGrid 上的相关对象。我希望有 BeginEdit 和 EndEdit 事件可以使这变得足够简单,但我似乎找不到任何这样的东西。我宁愿在 PropertyGrid 中显示时不锁定整个对象,因为这显然会阻塞我的搜索线程,直到选择另一个对象。
我对 Windows 窗体的线程模型有点陌生,所以我希望有一些我刚刚忽略的明显答案。有什么帮助吗?
编辑:在异步运行搜索之前同步克隆我的对象可能效率很低,以至于我还不如同步运行搜索本身 - 异步运行的目的当然是让我的用户在搜索执行时继续工作。搜索需要很好地扩展,因为我正在经历的数据集最终会变得任意大,这使得同步克隆看起来会导致我试图避免的可用性问题。