文档查看器和后台工作者

本文关键字:后台 工作者 文档 | 更新日期: 2023-09-27 18:03:54

加载和查看我的xps文档工作得很好,但是加载文档需要很长时间,而且你知道这会导致UI看起来不活跃。

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括号中的代码在后台工作器之外工作得很好,所以我知道代码是正确的。一旦后台工作线程被使用,它就会停止工作。如果我没有提供足够的信息,请提前原谅。我是初级程序员和新到这个网站。

文档查看器和后台工作者

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();
    }