Uwp 与画布控制相关的奇怪内存泄漏

Uwp 与画布控制相关的奇怪内存泄漏,uwp,win2d,Uwp,Win2d,我已经设法在一个非常小的测试项目中分离出一个奇怪的问题。所有代码都在下面的codebehind中 主要的一点是,如果按下按钮,我用一个新的网格替换主网格内容,并将一个新的CanvasControl添加到第二个新网格中,我不会得到内存泄漏 但是,如果替换继承网格的CanvasInGrid对象,并将画布添加到其自己的内容中,则每次按下按钮时,CanvasInGrid和CanvasControl的对象计数都会增加,如诊断工具/内存使用/拍摄快照所示 但如果我在CanvasInGrid中添加一个按钮,同

我已经设法在一个非常小的测试项目中分离出一个奇怪的问题。所有代码都在下面的codebehind中

主要的一点是,如果按下按钮,我用一个新的网格替换主网格内容,并将一个新的CanvasControl添加到第二个新网格中,我不会得到内存泄漏

但是,如果替换继承网格的CanvasInGrid对象,并将画布添加到其自己的内容中,则每次按下按钮时,CanvasInGrid和CanvasControl的对象计数都会增加,如诊断工具/内存使用/拍摄快照所示

但如果我在CanvasInGrid中添加一个按钮,同样也不会出现内存泄漏

我只能把这当成是画布控制中的一个错误?还是我遗漏了什么?以这种方式添加画布控件时,是否有安全的方法来防止此问题

即使我捕获CanvasInGrid_unload并设置Canvas=nothing,画布计数似乎没有增加,但我得到了一些其他东西,包括CanvasInGrid:

IntPtr+1+12+12 144

条件脆弱表+1+32+216 12 384 2592

有条件可扩展+容器+1+184+184 12 2208 2208

WindowsRuntimeMarshall+NativeOrstationVentRegistrationMPL+TokenListCount+1+20+20 12 240

WindowsRuntimeMarshal+NativeOrStationVentRegistrationMPL+EventRegistrationTokenListWithCount+1+24+241288

附录1.CanvasInGrid+1+20+206120 144

Public NotInheritable Class MainPage
    Inherits Page

    Private sp As New StackPanel
    Private MainGrid As New Grid

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        Content = sp
        Dim b As New Button
        b.Content = "test"
        AddHandler b.Click, AddressOf test
        sp.Children.Add(b)
        sp.Children.Add(MainGrid)

        Application.Current.DebugSettings.EnableFrameRateCounter = False

    End Sub


    Private Sub test(sender As Object, e As RoutedEventArgs)

        MainGrid.Children.Clear()

        'this does NOT cause a leak
        'Dim testgr = New Grid
        'Dim canv As New CanvasControl
        'testgr.Children.Add(canv)
        'gr.Children.Add(testgr)


        'this DOES cause a leak
        MainGrid.Children.Add(New CanvasInGrid)

    End Sub

End Class



Public Class CanvasInGrid
    Inherits Grid

    Public button As Button
    Public Canvas As CanvasControl

    Public Sub New()
        Canvas = New CanvasControl
        'button = New Button 'if I do this with a button instead of the Canvas there is no leak

        Children.Add(Canvas)
        'Children.Add(button)
    End Sub


End Class

我现在发现结果不一致,我可以通过按钮看到漏洞,但始终使用CanvasInGrid,从未单独添加主网格和内容。我注意到,CanvasControl具有“RemoveFromVisualTree”来释放资源。我测试了你的代码,但它运行良好,没有内存泄漏。您能提供关于您的开发环境的信息吗?例如,应用程序的最低运行版本和目标运行版本?@RichardZhang MSFT可能在
MainGrid.Children.Add(New CanvasInGrid)
中存在内存泄漏,win2d必须从可视化树手册中删除。尝试调用
canvas.RemoveFromVisualTree
将其删除。看见