나는 당신과 정확히 같은 문제가있었습니다.
이전에로드 된 페이지를 처분하지 않습니다. 이 문제를 해결하기 위해 수행 한 작업은 GetPage() 메서드가 끝날 때로드 된 페이지에 대한 참조를 보유하고 GetPage 메서드가 시작될 때 마지막으로로드 된 페이지를 처리하는 것입니다. 여기
당신이 추가적으로 질문에 대한 답 :
Public void PrintDocument(DocumentPaginator paginator, string title)
{
Dictionary<int, DocumentPage> pages = new Dictionary<int DocumentPage>();
for(int i=0; i<paginator.PageCount(); i++)
{
pages.Add(i, paginator.GetPage(i));
UnknownPrinterEngine.SendPageToPrinter(pages(i)); //this is just imagination
}
}
경우 : 내가 인상 System.Windows.Controls.PrintDialog.Print (DocumentPaginator, 제목)의 구현이
은 같은 것입니다 구현은 실제로 이와 비슷합니다. 메소드 실행이 끝날 때까지 각 처리 된 페이지에 대한 로컬 참조가 사전에 있습니다. -> 메모리가 해제되지 않습니다.
나는 그 (DocumentPaginator를 확장하는 클래스에서 GetPage 구현)을 방지하기 위해 무슨 짓을 :
DocumentPage lastLoadedPage = null;
public DocumentPage GetPage(int pageNumber)
{
if(lastLoadedPage != null)
{
lastLoadedPage.Dispose()
}
//MyPrintControl should be your custom UserControl which represents the page to print
myPrintControl pageContent = new MyPrintControl();
pageContent.Width = PageSize.Width;
pageContent.Height = PageSize.Height;
pageContent.Measure(PageSize);
pageContent.Arrange(new Rect(new Point(0,0), PageSize));
DocumentPage actualPage = New DocumentPage(pageContent);
lastLoadedPage = actualPage;
return actualPage;
}
그리고 마지막에 당신이는 IDisposable 인터페이스를 구현해야하며, 폐기 방법에 확보하기 위해 lastLoadedPage 필드를 정리
마지막 페이지의 메모리도.
신속한 답장을 보내 주셔서 감사합니다. 환상적인 수정입니다. GetPage() 메서드의 끝에서로드 된 페이지에 대한 참조를 "gard [ing] (guarding?)"가 의미하는 바를 명확하게 설명해 주시겠습니까? " 참조를 저장하기 위해 정적 변수를 사용 했습니까 (즉, GetPage에 대한 다음 호출까지 보존 될 수 있도록 ...). C#을 처음 사용하기 때문에 이것이 맞는지 확신 할 수 없습니까? 이전 페이지를 다른 인수로 전달 했습니까? 즉, GetPage (int pageNumber)에서 GetPage (int pageNumber, ref DocumentPage previous)와 같은 함수 시그니처로 변경)? –
내부에서 답변을 편집했습니다. 내 뜻을 이해하시기 바랍니다. – fixagon
흠 ... 나는 이것을 시도했지만 어떤 메모리도 공개하지 않았다 (Performance Manager를 사용하여 개인 바이트 할당을 관찰하여 성능을 확인했다). –