文档查看器和后台工作者
本文关键字:后台 工作者 文档 | 更新日期: 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();
}