Win2D 入門教程 VB 中文版 - 防止內存泄漏

避免內存泄漏

本文從微軟官方文檔翻譯

http://microsoft.github.io/Win2D/html/RefCycles.htm

?如果文檔有問題,可以在 https://github.com/Nukepayload2/Win2dDocVB發 Issue,也可以直接回復。

當在托管的 XAML 應用程序中使用 Win2D 控件,需要注意垃圾回收器回收這些控件前它們的引用計數循環。

你有一個問題,如果...

您正在使用 Win2D 從一種.NET 語言如 VB (不是 c + +)

您使用 Win2D XAML 控件之一:

l? CanvasControl

l? CanvasVirtualControl

l? CanvasAnimatedControl

l? CanvasSwapChainPanel

l? 你訂閱 Win2D 控件的事件 (例如 繪制,CreateResources,SizeChanged...)

l? 您的應用程序多個 XAML 頁之間來回移動

如果滿足所有這些條件,引用計數循環將阻止 Win2D 控件被垃圾回收。新的 Win2D 資源分配每次應用程序移動到一個不同的頁,但舊的永遠不會被釋放,所以內存泄漏。要避免此問題,必須添加代碼來顯式地打破這種循環。

如何修復它

打破引用計數循環,讓你的頁面進行垃圾回收:

處理Xaml頁面或對話框的Unloaded事件

在卸載處理程序,調用 RemoveFromVisualTree Win2D 控件并釋放 (通過設置為 Nothing) 對 Win2D 控件的任何顯式引用

示例代碼:

VB

    Private Sub page_Unloaded(sender As Object, e As RoutedEventArgs) Handles Me.UnloadedMe.canvas.RemoveFromVisualTreeMe.canvas = NothingEnd Sub

?

如何測試內存是否泄漏

若要測試是否您的應用程序正確打破引用循環,將代碼添加到包含 Win2D 控件的任何 XAML 頁或對話框的終結器方法:

VB

    Protected Overrides Sub Finalize()Debug.WriteLine("回收畫布")MyBase.Finalize()End Sub

?

在您的應用程序的構造函數建立一個計時器,它將使確定垃圾收集發生在固定的時間間隔:

VB

    Dim gcTimer As New DispatcherTimerAddHandler gcTimer.Tick, Sub() GC.CollectgcTimer.Interval = TimeSpan.FromSeconds(1)gcTimer.Start

?

導航到頁面,然后從它到其他頁面上。

引用循環打破后大概一秒你會在輸出窗口看到 "回收畫布"

請注意,調用 GC.Collect 會影響性能,所以您應該在測試后刪除此測試代碼

殘酷的細節

對象 A 引用了 B,同時 B 也引用 A.

這時發生一個循環。或者當 B 和 B 的引用引用 C,而 C 引用 A 等。

當訂閱事件的 XAML 控件,這種循環是幾乎不可避免:

l? XAML 頁保留對它所包含的所有控件的引用

l? 控件保持對已訂閱它們的事件處理程序委托的引用

l? 每個委托保存到其目標實例的引用

l? 事件處理程序通常是實例方法的 XAML 頁類,所以他們目標實例引用點返回到 XAML 頁面,創建一個循環

如果在.NET 中實現所有涉及的對象,這種循環不是問題因為.NET 垃圾回收,垃圾回收算法能夠識別并回收的對象組,即使它們鏈接在一個循環中。與.NET不同的是 c + + 管理內存的引用計數,無法檢測和回收循環對象。盡管有這種限制,使用 Win2D 的 c + + 應用程序沒有任何問題,因為 c + + 事件處理程序默認為弱引用而不是他們的目標實例的強引用。因此頁面引用該控件,而控件引用的事件處理程序委托,此委托未引用返回到頁面,所以沒有任何這種問題。

問題在于當.NET 應用程序使用 c + + WinRT 組件如 Win2D:

l? XAML 頁是應用程序的一部分,所以使用垃圾回收

l? Win2D 控制在 c + + 中實現,因此,使用引用計數

l? 事件處理程序委托是應用程序的一部分,所以使用垃圾回收,認為對其目標實例的強引用

一個引用循環是存在的但參加這個的 Win2D 對象不使用.NET 垃圾回收。這意味著垃圾收集器是無法看到整個鏈,因此它不能檢測或回收的對象。當這發生時,應用程序必須通過顯式打破循環幫忙。這可以通過釋放所有引用從頁面到控件 (如上文所建議) 或通過都釋放從控制到可能指向頁面 (使用頁卸載事件取消訂閱所有事件處理程序) 的事件處理程序委托的所有引用。

轉載于:https://www.cnblogs.com/Nukepayload2/p/win2d_doc_vb_memleak.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257602.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257602.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257602.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java concurrent 鎖_java并發機制鎖的類型和實現

synchronized 和 volatile,是最基礎的兩個鎖!volatile是輕量級鎖,它在多核處理器開發中保證了共享變量的可見性。即當一個線程修改一個共享變量時,其他線程能夠讀到這個修改的值。它比syncronized使用和成本更低。要說volatile的實…

JAXB和XStream比較

這兩東東本質上是有差別的,JAXB稱為OX binding工具,XStream應該算序列化工具,但OX binding工具也會marshall和unmarshall,所以包含了序列化這一部分。序列化工具不一定需要提供binding的功能。既然都玩序列化,那就簡單…

【起航計劃 011】2015 起航計劃 Android APIDemo的魔鬼步伐 10 App-Activity-Reorder Activities 后退棧 Intent FLAG...

Reorder Activities 示例有四個相關的Activitives: ReorderOnLaunch, ReorderTwo,ReorderThree, ReorderFour。其中ReorderOnLaunch為主Activity,ReorderOnLaunch啟動ReorderTwo ,ReorderTwo啟動 ReorderThree,ReorderThree啟動 ReorderFour。…

java date dateformat_java中Date與DateFormat的格式輸出

一、DateFormatjava.text.DateFormat使用 getDateInstance 來獲取該國家/地區的標準日期格式。另外還提供了一些其他靜態工廠方法。使用 getTimeInstance 可獲取該國家/地區的時間格式。使用 getDateTimeInstance 可獲取日期和時間格式。可以將不同選項傳入這些工廠方法&#x…

spartan6不能直接把時鐘連到IO上

1、問題的提出:spartan6中不允許時鐘信號直接連到IO口上面? 2、解決辦法:ODDR2的使用 ODDR2Primitive: Double Data Rate Output D Flip-Flop with Optional Data Alignment, Clock Enable and Programmable Synchronous or Asynchronous Set…

STL容器及適配器

STL容器 1.序列式容器 : vector,deque,list。 每個元素都有固定的位置(取決于插入的時機和位置,與元素值無關)。 vector 特點: 將一個元素置于一個動態數組中加以管理,可以隨機存取元…

Html5 Canvas斗地主游戲

過完年來公司,沒什么事,主管說研究下html5 游戲,然后主管就給了一個斗地主的demo,隨后我就開始看代碼, 現在我看了html5以及canvas相關知識和斗地主的demo后,自己用demo上的素材試著寫了個斗地主&#xff0…

java流的傳遞方式是_如何在方法中流式傳輸Java List(Varargs)的值?

我有以下方法:public static List getValuesExclusion(A exclusion) {return Arrays.stream(values()).filter(item -> item ! exclusion).collect(Collectors.toList());}//this function returns enum list of A types that has no A typeexclusion現在我想將它…

JAVA作業——JAVA課程的總結及學習計劃

JAVA作業——JAVA課程的總結及學習計劃 NO.1 總結 在上一年的學習中,對JAVA語言比較陌生,英語基礎不好,so學習起來有點困難,對JAVA的一些語法和編程記得比較少。 NO.2 計劃 對過去一年的認真反思之后,我的計劃如下&…

由LintCode問題子集出發,淺析ArrayList的拷貝問題

在做LintCode上的遞歸類題目子集時&#xff0c;我一開始的想法是遞歸到最后一層即單元素時然后開始逐層返回&#xff0c;產生相應的每層的子集并添加到最終的結果中去。于是乎有了以下代碼&#xff1a; public List<List<Integer>> findSolution(int[] nums, int b…

大小端模式詳解

http://www.cnblogs.com/xinsheng/archive/2012/04/18/2455039.html 端模式&#xff08;Endian&#xff09;的這個詞出自Jonathan Swift書寫的《格列佛游記》。這本書根據將雞蛋敲開的方法不同將所有的人分為兩類&#xff0c;從圓頭開始將雞蛋敲開的人被歸為Big Endian&#xf…

.NET 跨平臺服務端資料

OWIN Web API: http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api 用于寫API的 OWIN SignalR: http://www.dotnetcurry.com/signalr/915/owin-katana-signalr-web-server 用于寫即時通訊的轉載于:https://www.cnblogs.com/Jarvin…

mysql的查詢、子查詢及連接查詢

一、mysql查詢的五種子句 where子句&#xff08;條件查詢&#xff09;&#xff1a;按照“條件表達式”指定的條件進行查詢。 group by子句&#xff08;分組&#xff09;&#xff1a;按照“屬性名”指定的字段進行分組。group by子句通常和count()、sum()等聚合函數一起使用。 h…

BZOJ-1192-鬼谷子的錢袋

描述 鬼谷子非常聰明&#xff0c;正因為這樣&#xff0c;他非常繁忙&#xff0c;經常有各諸侯車的特派員前來向他咨詢時政。有一天&#xff0c;他在咸陽游歷的時候&#xff0c;朋友告訴他在咸陽最大的拍賣行&#xff08;聚寶商行&#xff09;將要舉行一場拍賣會&#xff0c;其中…

lamp 獨立mysql_lamp or lnmp 環境搭建之獨立安裝mysql數據庫

lamp or lnmp 環境搭建,如果mysql 是獨立安裝的則需要授權&#xff1a;單獨一臺服務器獨立安裝mysql安裝后&#xff0c;優化服務器。授權實例如下&#xff1a;創建用戶CREATE USER demo IDENTIFIED BY “passwd123”;授權使用mysql數據庫下面的所有表GRANT ALL PRIVILEGES ON m…

item 24: 區分右值引用和universal引用

本文翻譯自《effective modern C》&#xff0c;由于水平有限&#xff0c;故無法保證翻譯完全正確&#xff0c;歡迎指出錯誤。謝謝&#xff01; 博客已經遷移到這里啦 古人曾說事情的真相會讓你覺得很自在&#xff0c;但是在適當的情況下&#xff0c;一個良好的謊言同樣能解放你…

WebLogic11g-常用運維操作

轉自&#xff1a;https://dead-knight.iteye.com/blog/1940399 希望這篇能把weblogic運維時經常遇到的問題、常用的配置匯總到一起。 1、配置jvm參數&#xff1a; 一般在domain啟動過程中會看到以下啟動的日志信息&#xff0c;如下圖所示&#xff1a; 圖中紅色方框部分為啟動we…

牛腩新聞發布系統(一):SQLHelper重構(一)

導讀&#xff1a;在機房重構的時候&#xff0c;就用到了SQLHelper&#xff0c;但那時候即使把代碼反復看了很多遍&#xff0c;也看了注釋&#xff0c;還和同學交流&#xff0c;也依然是半懂不懂。現在&#xff0c;我再次用到了SQLhelper這個東西&#xff0c;就來說說SQLHelper是…

OPENCV圖像輪廓檢測

前面在圖像轉換的時候學到canny算子,可以檢測出圖像的輪廓信息,但是,該算子檢測到的輪廓信息還需要我們手動的用眼睛去識別,而實際工程應用中,我們需要得到輪廓的具體數學信息,這就涉及到今天的主題,圖像輪廓檢測. 一.圖像輪廓檢測 在opencv中,輪廓對應著一系列的點的集合,open…

mysql 5.7.11 授權_mysql 5.7.11 安裝配置教程

六步輕松搞定mysql5.7.11的安裝1、下載安裝包。mysql-5.7.11版本&#xff1a;2、拷貝到任意盤&#xff1a;例如&#xff0c;解壓后拷貝文件夾至C盤&#xff1a;C:\Program Files\mysql。建議文件夾名字使用英文。3、配置環境變量&#xff1a;計算機—>右鍵—>高級系統設置…