Silverlight에서 사용자 지정 텍스트 상자 컨트롤에 대해 여러 실행 취소/다시 실행 시스템을 작성하고 있습니다. 내가 지금하고있는 일은 메모리 소비를 줄이는 것이다.일반 스택을 사용한 가비지 수집
그래서 내가 가지고있는 문제는 내가 사용하고있는 스택이 너무 오래 메모리에 저장되어 있다는 것입니다.
Count
이 자연스럽게 0에 도달하거나 이벤트로 인해 스택이 지워질 때마다 스택을 모두 지우는 것이 상대적으로 저렴할 것입니다. 그래서 나는 그것을 기대하고,이 코드를 그렇게하려고 해요합니다 ... GC에 의해
TextHistory.Clear()
TextHistory = Nothing
을 집어됩니다하지만 확실히 작동하지 않습니다,이 스택은 잠재적으로 50메가바이트 이상을 보유 할 수 있습니다. 그런데 TextHistory
은 Stack(Of Moment)
입니다. 그리고 여기 (T의)를 Moment
클래스 ...
Public Class Moment
Public Text As String
Public SelectionStart As Integer
Public SelectionLength As Integer
Public Sub New(ByRef _Text As String, _SelectionStart As Integer, _SelectionLength As Integer)
Text = _Text
SelectionStart = _SelectionStart
SelectionLength = _SelectionLength
End Sub
End Class
* * 작동합니다. 당신이 우리에게 문제를 일으키고 있다고 말하지 않은 것이 있습니다. GC가 즉시 발생하지 않는다는 것을 알고 있습니까? – usr
TextHistory 스택 또는 다른 Moment 객체에 대한 참조를 다른 곳에 보관하지 않는다고 가정하는 것이 안전할까요? – roken
@usr - GC가 즉시 발생하지 않는다는 것을 알고 있지만 GC.GetTotalMemory()와 전체 Silverlight 프로세스의 실제 메모리 사용량을 모두보고 있으며 몇 분 동안 모든 메모리를 보유하고 있습니다. (아마 영원히). 그런 다음 TextHistory 스택에 푸시하는 선을 주석 처리하고 동일한 작업을 수행 할 때 메모리 사용량이 2MB 또는 3MB 증가합니다 (50 회는 반대). –