2016-08-25 5 views
1

내 xps 문서로드 및보기는 정상적으로 작동하지만 문서를로드하는 데 오랜 시간이 걸리고 사용자 인터페이스가 비활성 상태로 표시됩니다.documentviewer 및 backgroundworker

XpsDocument xpsDocument = new XpsDocument(@"Resources\maintManual.xps", FileAccess.Read); 
documentViewer1.Document = xpsDocument.GetFixedDocumentSequence(); 

그래서, 내가있는 BackgroundWorker를 통해 문서를로드하려고 :

private void maintBtn_TouchDown(object sender, TouchEventArgs e) // load and view maint manual 
{ 
    BackgroundWorker worker = new BackgroundWorker(); 
    worker.WorkerReportsProgress = true; 
    worker.DoWork += worker_DoWork; 
    worker.ProgressChanged += worker_ProgressChanged; 
    worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
    worker.RunWorkerAsync(); 
} 

void worker_DoWork(object sender, DoWorkEventArgs e) // do work 
{ 
    XpsDocument xpsDocument = new XpsDocument(@"Resources\maintManual.xps", FileAccess.Read); 
    documentViewer1.Document = xpsDocument.GetFixedDocumentSequence(); 
} 

을 즉시 "Dowork"는 UI "충돌"실행될 때 (완전히 잠급니다). 이유를 찾을 수없는 것 같습니다. 백그라운드 작업자를 통해 문서를 호출하는 더 좋은 방법이 있습니까? 앞에서 말했듯이, Dowork 대괄호의 코드는 백그라운드 작업자 외부에서 작동합니다. 따라서 코드가 옳다는 것을 알고 있습니다. 일단 배경 작업자가 사용되면 작동을 멈 춥니 다. 충분한 정보가 없으면 사전에 용서해주십시오. 나는 주니어 코더이고이 사이트에 새로운 사람이다.

+0

봐 : http://stackoverflow.com/questions/1862590/how-to-update-gui- with-backgroundworker 아마도 도움이됩니다. – BWA

답변

0

UI의 변경은 UI 스레드에서만 가능합니다. main/ui 스레드가 아니라면 사용자 컨트롤의 일부 속성에 액세스 할 수 없습니다.

추천 : IO 메서드는 새 작업에서 실행되지만이 작업의 결과는 주 스레드의 UI 컨트롤에 적용됩니다.

그러나 나는 내가이 일을해야 가정 XpsDocument 무엇인지 모르는이에서

private async void maintBtn_TouchDown(object sender, TouchEventArgs e) // load and view maint manual 
    { 
     XpsDocument xpsDocument = await Task.Run(() => new XpsDocument(@"Resources\maintManual.xps", FileAccess.Read)); 
     documentViewer1.Document = xpsDocument.GetFixedDocumentSequence(); 
    } 
+0

대단한 위대한 트릭을 해 주셔서 감사합니다! – user6505984