首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在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

复制
相关文章
BackgroundWorker在单独的线程上执行操作
直接使用多线程有时候会带来莫名其妙的错误,不定时的发生,有时候会让程序直接崩溃,其实BackgroundWorker 类允许您在单独的专用线程上运行操作。可以通过编程方式创建 BackgroundWorker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。
张果
2022/05/09
1.3K0
BackgroundWorker在单独的线程上执行操作
在 WPF 中实现融合效果
融合效果是指对两个接近的元素进行高斯模糊后再提高对比度,使它们看上去“粘”在一起。在之前的一篇文章中,我使用 Win2D 实现了融合效果,效果如下:
dino.c
2022/10/05
1.4K0
在 WPF 中实现融合效果
在 Emacs 中编辑 crontab
一般来说,编辑 crontab 时可以用 crontab -e ,它会读取 EDITOR 环境变量来决定需要打开的编辑器,比如:
飞驰的西瓜
2023/03/01
7050
在 Emacs 中编辑 crontab
在 WPF 中获取一个依赖对象的所有依赖项属性
本来 .NET 中提供了一些专供设计器使用的类型 TypeDescriptor 可以帮助设计器找到一个类型或者组件的所有可以设置的属性,不过我们也可以通过此方法来获取所有可供使用的属性。
walterlv
2023/10/22
7350
并发编程 ---为何要线程池化
众所周知,使用线程可以极大的提高应用程序的效率和响应性,提高用户体验,但是不可以无节制的使用线程,为什么呢?
Niuery Diary
2023/10/22
2030
并发编程 ---为何要线程池化
在 Docker 容器中编辑文件
我希望每次在docker容器中安装vi的时候谁会给我1美元...我想要一个在运行的docker容器编辑文件的更简单的方式。首先,尝试避免编辑文件,这违背了容器的哲学理念(见最后一段)。
星哥玩云
2022/07/03
5.6K0
在 Docker 容器中编辑文件
如果在BackgroundWorker运行过程中关闭窗体…
在Windows Form应用中,BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。由于操作是异步执行的,用户可能在异步操作执行过程中关闭当前窗体,而窗体的关闭会伴随着Dispose方法的执行。如果我们注册了BackgroundWorker的RunWorkerC
蒋金楠
2018/02/07
1.3K0
如果在BackgroundWorker运行过程中关闭窗体…
在Cookie中存储对象
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/46955119
DannyHoo
2018/09/13
4K0
backgroundworker组件的使用
本文转载:http://www.cnblogs.com/inforasc/archive/2009/10/12/1582110.html
跟着阿笨一起玩NET
2018/09/19
1K0
使用nano在Linux中编辑文件
GNU nano,简称nano,是大多数Linux发行版的基本内置编辑器。GNU nano是一个小巧友好的文本编辑器. 与基本的文本编辑相比,nano提供许多额外的特性,例如:交互式的查找和替换,定位到指定的行列,自动缩进,特性切换,国际化支持,以及文件名标记完成。本教程中,我们将介绍一些帮助您入门的基本知识。
风研雨墨
2018/08/17
7.5K0
WPF性能优化:Freezable 对象
Freezable是WPF中一个特殊的基类,用于创建可以冻结(Freeze)的可变对象。冻结一个对象意味着将其状态设置为只读,从而提高性能并允许在多线程环境中共享对象。
czwy
2023/10/22
4470
C# BackgroundWorker用法详解
在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题。解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完成。但是原生接口的线程操作有一些难度,如果要更进一步的去完成线程间的通信就会难上加难。
zls365
2021/01/13
1.4K0
C# BackgroundWorker用法详解
在 JavaScript 中如何克隆对象?
我们假设一个变量 name 具有一个与之关联的原始值(number,string,boolean,undefined 和null)。 如果我们将此变量 name 复制到另一个变量name2 ,则原始变量的任何修改都不会影响到第二个变量,因为它们是原始值。
前端小智@大迁世界
2022/06/15
4.9K0
【6】VScode 无法在终端输入问题,提示:无法在只读编辑器中编辑
2.在设置中输入 run code config 找到里面的 run in terminal 打勾即可,往下滑动几秒就看到了
汀丶人工智能
2022/12/21
7.5K0
【6】VScode 无法在终端输入问题,提示:无法在只读编辑器中编辑
6搞懂线程池(二)
抱歉各位多线程专栏托更这么久,这篇文章我们继续讲线程池的相关知识,其中将涉及到如下知识:
喵叔
2020/09/08
5080
在 WPF 程序中应用 Windows 10 真•亚克力效果
从 Windows 10 (1803) 开始,Win32 应用也可以有 API 来实现原生的亚克力效果了。不过相比于 UWP 来说,可定制性会差很多。
walterlv
2023/10/22
5880
在 WPF 程序中应用 Windows 10 真•亚克力效果
学习WPF——了解WPF中的XAML
XAML的简单说明 XAML是用于实例化.NET对象的标记语言,主要用于构建WPF的用户界面 XAML中的每一个元素都映射为.NET类的一个实例,例如<Button>映射为WPF的Button对象 XAML可以在一个元素中嵌套另一个元素,例如Grid元素可以嵌套Button元素 了解XAML VisualStudio创建一个窗口,默认情况下产生的代码如下: 这段代码中包含两个标记元素,一个是Window,一个是Grid Window是WPF顶级元素的一种,还有另外两种顶级元素Page和App
liulun
2018/01/12
2K0
在 Hue 中启用 Phoenix SQL 编辑器
在CDP7.1.8开始,Hue支持了很多编辑器,这里介绍了在CDP7.1.8中配置Hue支持Phoenix SQL。
大数据杂货铺
2022/12/02
1.7K0
在 Hue 中启用 Phoenix SQL 编辑器
JAVA对象在JVM中内存分配
如果你还不了解JVM内存模型的建议您先看下JVM内存模型 以一下代码为例,来分析下,java的实例对象在内存中的空间分配(JDK1.8)。 public class Student { private String name; private static Birthday birthday = new Birthday(); public Student(String name) { this.name = name; } public sta
java404
2018/05/18
1.9K0
WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项。不过,通常更有实际价值的是更复杂的 UWP 控件的引入,通常是一整个 Page。
walterlv
2020/02/10
6K0

相似问题

在BackgroundWorker中填充WPF图表

20

WPF BackgroundWorker执行

21

BackgroundWorker和WPF

30

在WPF中用BackgroundWorker更新UI

32

在WPF中结合使用BackgroundWorker和ProgressBar

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档