2016-08-25 36 views
1

加載和查看我的xps文檔工作得很好,但加載文檔需要很長時間,並且您知道導致UI看起來不活動。documentviewer和backgroundworker

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

所以,我想通過BackgroundWorker的加載文件:作爲爲 「DoWork的」 執行UI 「崩潰」 很快

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括號中的代碼在它自己的背景工作者之外工作得很好,所以我知道代碼是正確的。一旦使用了後臺工作器,它將停止工作。如果我沒有提供足夠的信息,請提前原諒我。我是初級編碼員,也是本網站的新手。

+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