none
AutomationElement对象啥时候被释放掉

    问题

  • 我获取了一个窗口的AutomationElement对象,想用while (!currWin.Current.IsOffscreen) ;来等待窗口被关闭,但执行的过程中抛出了一个异常(如下),虽然频率不是很高,但毕竟是个问题啊!所以就很想知道,AutomationElement对象到底是什么时候被释放的?能否检测?如果不能有没有替代的可以等待窗口关闭的方法?

    目标元素的对应 UI 不再可用(例如,父窗口已关闭)。
       在 MS.Internal.AutomationProxies.Misc.ThrowWin32ExceptionsIfError(Int32 errorCode)
       在 MS.Internal.AutomationProxies.Misc.GetWindowRect(IntPtr hwnd, Win32Rect& rc)
       在 MS.Internal.AutomationProxies.ProxySimple.get_BoundingRectangle()
       在 MS.Internal.AutomationProxies.ProxySimple.IsOffscreen()
       在 MS.Internal.AutomationProxies.ProxySimple.GetElementProperty(AutomationProperty idProp)
       在 MS.Internal.AutomationProxies.ProxyHwnd.GetElementProperty(AutomationProperty idProp)
       在 MS.Internal.AutomationProxies.ProxySimple.System.Windows.Automation.Provider.IRawElementProviderSimple.GetPropertyValue(Int32 propertyId)

    2016年12月3日 6:03

答案

  • 这个响应函数什么时候执行完?

    是在这个函数体执行完了以后,就正常结束。


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年12月23日 5:33
    版主

全部回复

  • Hi   朋友的朋友,

    根据我的了解,如果你的项目类型是WPF项目,当你使用AutomationElement时候可能会导致内存泄露,因为WPF会给自己3分钟相应UI Automation的时间,
    内部会启动一个定时器,如果立即相应UI Automation事件,定时器将不会走,直到3分钟以后。
    然后workaround将一直等待这个定时器超时,然后调用GC去清除。
    我觉得这样应该就是你说的有时候会出现异常。

    UI Automation 会导致内存泄露的原因,已经报告给微软Connect项目组。详细的情况可以看一下这个链接
    希望我的回复能帮助到你。
    Best Regards,
    Hart

    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年12月5日 8:02
    版主
  • Hi   朋友的朋友,

    根据我的了解,如果你的项目类型是WPF项目,当你使用AutomationElement时候可能会导致内存泄露,因为WPF会给自己3分钟相应UI Automation的时间,
    内部会启动一个定时器,如果立即相应UI Automation事件,定时器将不会走,直到3分钟以后。
    然后workaround将一直等待这个定时器超时,然后调用GC去清除。
    我觉得这样应该就是你说的有时候会出现异常。

    UI Automation 会导致内存泄露的原因,已经报告给微软Connect项目组。详细的情况可以看一下这个链接
    希望我的回复能帮助到你。
    Best Regards,
    Hart

    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    不是呢,我做的就是普通的winform程序,像你说的,是不是只要有UI Automation事件,定时器就应该随时被重置,而不会超时?

    我现在要操控的窗体中有个一个关闭窗口的Button。首先,我获取到窗体的AutomationElement对象winElement;然后,获取到关闭按钮的AutomationElement对象btnElement。

    当我点击关闭按钮,也就是调用InvokePattern.Inoke()方法,这个时候应该等待3min中后窗体对象winElement才会被释放。但我调用完invoke方法后,立即调用了winElement.Current.IsOffscreen来检测窗体是否已关闭,却在偶然的一次遇到了异常。但我觉得我的思路应该是对的吧?


    2016年12月16日 3:33
  • Hi,

    invoke 是异步调用,不知道会不会对这有影响。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年12月16日 9:10
    版主
  • Hi,

    invoke 是异步调用,不知道会不会对这有影响。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    invoke是异步的么?那invoke方法调用后如何保证调用结束?

    2016年12月19日 13:13
  • 据我所知,是异步操作的,invoke的方法掉用的方法結束以后,就會結束。

    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年12月20日 7:13
    版主
  • 说错了,其实我想问的是,那如何保证响应函数已经执行结束呢?就比如按钮,调用了invoke方法后,必然会调用这个按钮的click响应函数,如何保证这个响应函数已经执行完了呢?
    2016年12月23日 5:11
  • 这个响应函数什么时候执行完?

    是在这个函数体执行完了以后,就正常结束。


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年12月23日 5:33
    版主