首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在BackgroundWorker中编辑wpf对象

在BackgroundWorker中编辑wpf对象
EN

Stack Overflow用户
提问于 2016-11-29 03:13:47
回答 1查看 194关注 0票数 0

我编写了一个程序,为一个文件导入一些polyline数据。之后,我必须使用wpf polyline元素执行一些shift任务。最初,我只进行了一次迭代,在计算过程中对Gui的阻塞是没有问题的。但是,如果我进行多次移位迭代,Gui就会被阻塞一段时间。因此,我添加了一个BackgroundWorker来解决这个问题。我的程序的结构可以在这里看到:

代码语言:javascript
运行
AI代码解释
复制
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
    }
}

我现在有两个问题:

  1. 因为我的polyline元素已经属于MainGui线程,所以抛出了一个System.InvalidOperationException。我试图用Dispatcher来解决这个问题。但是如果我添加这个代码,我的Gui又被阻塞了。将引用的对象polyline传递给工作人员的好方法是什么? this.Dispatcher.Invoke(() ) => {.//这里的代码。});
  2. 每次迭代之后,我都想更新画布上的polylines,但不幸的是,这不能正常工作。而且,直到迭代结束,我的ProgressBar才会更新。有办法解决这个问题吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-02 08:00:50

在我做了一个简短的测试以检查我是否能够用MVVM模式解决我的问题之后,我决定MVVM太难在我的程序中实现,这将花费我太长的时间。因此,我寻找另一个解决方案,我找到了,并想给你们看。

解决方案:

我实现了与polyline元素a List<List<Point>>并行的程序。我预置列表中各点上的所有移动任务,当我想在BackgroundWorker中更新Gui时,我将此任务(参见初始发布中的代码)发送到主线程,并使用foreach覆盖polyline的各个点。现在,我的接口是响应的,在每一个迭代步骤之后,我可以更新我的Gui。这样我就解决了这两个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40864485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档