3

엄격하게 이론적 인 문제와 직결 된 WPF의 DocumentPaginator :WPF DocumentPaginator는 인쇄 작업을 완료 할 때까지 모든 DocumentPages를 메모리에 유지합니까?

여러 페이지의 문서를 인쇄 할 WPF DocumentPaginator 클래스를 사용하는 경우, 매기기는 문서가 완료 될 때까지이 메모리에 인쇄 작업의 역사를 통해 요청하는 DocumentPages을 모두 유지 않습니다 인쇄? 또는 인쇄 작업이 끝나기 전에 더 이상 필요없는 DocumentPages를 처분합니까 (즉, 메모리를 비우는 것)? 예외 처리없이 인쇄 도중에 이전/불필요한 DocumentPages를 수동으로 페이징하도록 지시하는 방법이 있습니까?

많은 도움을 주셔서 감사합니다.

답변

2

나는 당신과 정확히 같은 문제가있었습니다.

이전에로드 된 페이지를 처분하지 않습니다. 이 문제를 해결하기 위해 수행 한 작업은 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 필드를 정리

마지막 페이지의 메모리도.

+0

신속한 답장을 보내 주셔서 감사합니다. 환상적인 수정입니다. GetPage() 메서드의 끝에서로드 된 페이지에 대한 참조를 "gard [ing] (guarding?)"가 의미하는 바를 명확하게 설명해 주시겠습니까? " 참조를 저장하기 위해 정적 변수를 사용 했습니까 (즉, GetPage에 대한 다음 호출까지 보존 될 수 있도록 ...). C#을 처음 사용하기 때문에 이것이 맞는지 확신 할 수 없습니까? 이전 페이지를 다른 인수로 전달 했습니까? 즉, GetPage (int pageNumber)에서 GetPage (int pageNumber, ref DocumentPage previous)와 같은 함수 시그니처로 변경)? –

+0

내부에서 답변을 편집했습니다. 내 뜻을 이해하시기 바랍니다. – fixagon

+0

흠 ... 나는 이것을 시도했지만 어떤 메모리도 공개하지 않았다 (Performance Manager를 사용하여 개인 바이트 할당을 관찰하여 성능을 확인했다). –

0

찾아보기 System.Windows.Xps.VisualsToXpsDocument 큰 xps 문서를 만들 때 메모리 부족 문제를 해결합니다. PrintQueue.CreateXpsDocumentWriter(somePrintQueue)도 참조하십시오. 죄송합니다. 담당자에게 충분한 설명을 남기지 못했습니다.

관련 문제