我编写了一个程序,为一个文件导入一些polyline
数据。之后,我必须使用wpf polyline
元素执行一些shift任务。最初,我只进行了一次迭代,在计算过程中对Gui的阻塞是没有问题的。但是,如果我进行多次移位迭代,Gui就会被阻塞一段时间。因此,我添加了一个BackgroundWorker
来解决这个问题。我的程序的结构可以在这里看到:
class MainGui
{
private readonly BackgroundWorker worker = new BackgroundWorker();
List<Polyline> _lines;
int _iterationCount = 10;
public MainGui()
{
worker.DoWork += worker_DoWork;
worker.WorkerReportsProgress = true;
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
}
public void MainTask()
{
_lines = Import.ImportLines();
DrawLines(_lines);
}
private void button_Click(object sender, RoutedEventArgs e)
{
worker.RunWorkerAsync();
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < _iterationCount; i++)
{
ShiftTask.DoShift(_lines);
// worker.ReportProgress((int)((_workerProgressBase - _overlFid[0].Count) / _workerProgressBase * 100));
(sender as BackgroundWorker).ReportProgress((int)((_iterationCount - i) / _iterationCount * 100));
// here I would like to update my canvas
}
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
ProgressBar.Value = e.ProgressPercentage;
}
private void DrawLines(List<Polyline> lines)
{
// draw lines on wpf canvas
}
}
我现在有两个问题:
polyline
元素已经属于MainGui线程,所以抛出了一个System.InvalidOperationException
。我试图用Dispatcher
来解决这个问题。但是如果我添加这个代码,我的Gui又被阻塞了。将引用的对象polyline
传递给工作人员的好方法是什么?
this.Dispatcher.Invoke(() ) => {.//这里的代码。});polylines
,但不幸的是,这不能正常工作。而且,直到迭代结束,我的ProgressBar
才会更新。有办法解决这个问题吗?发布于 2016-12-02 08:00:50
在我做了一个简短的测试以检查我是否能够用MVVM模式解决我的问题之后,我决定MVVM太难在我的程序中实现,这将花费我太长的时间。因此,我寻找另一个解决方案,我找到了,并想给你们看。
解决方案:
我实现了与polyline
元素a List<List<Point>>
并行的程序。我预置列表中各点上的所有移动任务,当我想在BackgroundWorker
中更新Gui时,我将此任务(参见初始发布中的代码)发送到主线程,并使用foreach
覆盖polyline
的各个点。现在,我的接口是响应的,在每一个迭代步骤之后,我可以更新我的Gui。这样我就解决了这两个问题。
https://stackoverflow.com/questions/40864485
复制相似问题