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