我正在编写一个 C# 程序,它通过 Com 互操作使用 UI 自动化。但是,我在从另一个事件处理程序中添加/删除事件处理程序时遇到问题:
我的程序启动了一个新的 MTA 线程,并在该线程上调用 AddFocusChangedEventHandler()。
我想监视焦点元素的属性更改。因此,在焦点更改处理程序中,我对先前获得焦点的元素调用 RemovePropertyChangedEventHandler(),对新获得焦点的元素调用 AddPropertyChangedEventHandler()。
但是,我发现在大约两次焦点更改之后,我不再获得焦点更改或属性更改事件。我的预感是有东西阻塞了后台线程。
如果我删除属性更改的代码,那么焦点跟踪将按预期工作。
我不确定这是否相关 - 但文档指出事件处理程序应该在同一个线程上添加/删除。由于我在一个焦点更改事件中调用 AddPropertyChangedEventHandler(),并在另一个焦点更改事件中调用 RemovePropertyChangedEventHandler(),因此这两个调用可能在不同的线程上执行。但是,我怀疑情况是否如此 - 即使是这样,它也不应该表现出我看到的阻塞行为。为了完整起见,这里只提一下。