首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从Backgroundworker DoWork访问窗口控件

BackgroundWorker是一个在后台线程中执行操作的组件,它可以帮助我们在进行耗时操作时保持UI界面的响应性。在DoWork事件中,我们可以编写需要在后台执行的代码。

访问窗口控件是一个常见的需求,但是由于UI控件只能在创建它们的线程上访问,所以在BackgroundWorker的DoWork事件中直接访问窗口控件是不允许的。这是因为UI控件属于UI线程,而DoWork事件是在后台线程中执行的。

为了在BackgroundWorker的DoWork事件中访问窗口控件,我们可以使用以下方法:

  1. 使用Control.Invoke方法:通过Control.Invoke方法,我们可以将访问窗口控件的代码委托给UI线程执行。这样可以确保在UI线程上执行,避免线程安全问题。示例代码如下:
代码语言:csharp
复制
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    // 在后台线程中执行的代码
    // ...

    // 访问窗口控件
    this.Invoke((MethodInvoker)delegate
    {
        // 在UI线程上执行的代码
        // ...
    });
}
  1. 使用Control.BeginInvoke方法:与Control.Invoke类似,Control.BeginInvoke也可以将访问窗口控件的代码委托给UI线程执行。不同之处在于,Control.BeginInvoke是异步执行的,不会阻塞后台线程。示例代码如下:
代码语言:csharp
复制
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    // 在后台线程中执行的代码
    // ...

    // 访问窗口控件
    this.BeginInvoke((MethodInvoker)delegate
    {
        // 在UI线程上执行的代码
        // ...
    });
}

需要注意的是,访问窗口控件时要确保控件已经创建并可访问。可以在窗口的Load事件中启动BackgroundWorker,并在窗口的Closing事件中停止BackgroundWorker。

以上是关于从BackgroundWorker的DoWork事件中访问窗口控件的方法。希望对你有所帮助!如果你对云计算或其他相关话题有更多问题,欢迎继续提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【愚公系列】2023年12月 Winform控件专题 BackgroundWorker控件详解

一、BackgroundWorker控件详解 BackgroundWorker控件是Windows Forms中提供的一个轻量级组件,用于在后台线程中执行耗时的操作,避免阻塞UI线程,提高应用程序的响应性能...BackgroundWorker控件提供了以下事件和方法,以方便在异步操作中实现进度报告、取消操作、完成操作等功能: 事件: DoWork:异步线程执行操作的事件。...使用BackgroundWorker控件时,需要注意以下几点: 在DoWork事件中执行耗时的操作,不能调用UI线程上的控件,如需更新UI上的控件,需要在ProgressChanged事件中调用。...异步处理问题:在Winform应用程序中,有时需要异步地执行某些操作,比如在窗口关闭时保存数据、进行数据同步等,BackgroundWorker可以帮助实现异步操作,避免阻塞UI线程。...首先,在 UI 界面中添加一个 Label 控件用于显示结果,一个 Button 控件作为触发事件的按钮,以及一个 BackgroundWorker 控件

27611

backgroundworker组件的使用

开始 在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以工具上直接拖到应用程序: BackgroundWorker backgroundWorker1 = new BackgroundWorker...(); 为了开始在后台操作,必须调用BackgroundWorker的RunWorkerAsync()方法,当调用此方时,BackgroundWorker 通过触发DoWork 事件,开始执行后台操作...代码如下: 代码一: BackgroundWorker backgroundWorker1 = new BackgroundWorker(); //在另一个线程里开始操作(btnStart是一个按钮控件....RunWokerAsync(2000/*参数是可选的*/);  }  //DoWork事件在另一个线程里执行  private void backgroundWorker1_DoWork(objectsender...e) {        //progressBar1是ProgressBar控件        progressBar1.Value = e.ProgressPercentage;  }

94320

C#中连接数据库15秒检测程序假死避免问题

当然,这种假死状态不仅仅局限于这15秒的测试,还有数据库的大数据量查询,大数据量处理,大数据量下载等等,我们可以对思路进行转变,转变为利用一个后台运行进程控件来实现后台自动运行,不影响前台界面的操作,从而避免期间用户操作不了界面...C#,VS中有一个控件叫做BackgroundWorker,他的意思是在单独的线程上执行操作。 ?...调用该方法后,将触发BackgroundWorker.DoWork事件,并以异步的方式执行DoWork事件中的代码。 该方法还有一个带参数的重载方法:RunWorkerAsync(Object)。...需要注意的是,由于DoWork事件内部的代码运行在非UI线程之上,所以在DoWork事件内部应避免于用户界面交互,而于用户界面交互的操作应放置在ProgressChanged和RunWorkerCompleted..._DoWork(object sender, DoWorkEventArgs e)         { if (backgroundWorker1.CancellationPending !

1.4K20

BackgroundWorker在单独的线程上执行操作

可以通过编程方式创建 BackgroundWorker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。...如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。 若要设置后台操作,请为 DoWork 事件添加一个事件处理程序。...BackgroundWorker 事件不跨 AppDomain 边界进行封送处理。请不要使用 BackgroundWorker 组件在多个 AppDomain 中执行多线程操作。...下面使用BackgroundWorker 完成斐波那契数列的后台运算操作,斐波那契数列:1,1,2,3,5,8...n=(n-1)+(n-2) BackgroundWorker bw;         ...//在 DoWork 事件处理程序内部,可以              //oWorkEventArgs.Argument 属性中提取该参数。

1.2K10

数据字典生成工具之旅(9):多线程使用及介绍

这一篇将在之前的代码生成器上讲解多线程的应用,多线程的概念和好处这里就不多说了,另外本篇开始后面的实例代码都将放到SVN管理工具上维护,大家可以直接使用SVN工具进行下载。...先看一下msdn的介绍:        访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。...确保以线程安全方式访问控件非常重要。   ...C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它。      ...BackgroundWorker组件设置WorkerReportsProgress(是否允许通知进度改变)为true     2.添加DoWork(进行耗时操作) 和 ProgressChanged(进度改变执行

1.2K61

一个通过BackgroundWorker实现WinForm异步操作的例子

当点击Start按钮,以异步的方式存储介质中逐条获取数据,并将获取的数据追加到对应的ListBox中,ProgressBar真实反映以获取的数据条数和总记录条数的百分比,同时,当前获取的条数也会在下方的...随后,将会触发其DoWork事件,Dowork event handler处理代码如下: 1: private void backgroundWorkerLeft_DoWork(object sender...之所以要将这两个参数传入RetrieveData()方法,是因为该方法是为两个BackgroundWorker服务的,需要通过参数来区别当前是哪个BackgroundWorker。...percentProgress); public void ReportProgress(int percentProgress, object userState); percentProgress代表当前进度,0...e.ProgressPercentage; 6: this.listBoxLeft.Items.Add(record.Value); 7: } 注:这些操作需要操作UI上的控件

47210

【C#】带等待窗体的BackgroundWorker

接口 在DoWork事件中可以访问一组bgwUI提供的属性和方法更新等待窗体上的文本和进度,以及可以控制等待窗体上的【取消】按钮是否可见。...为true,等待窗体会显示【取消】按钮,用户可以通过点击它发出终止任务的请求,你可以像老样子一样,在DoWork访问CancellationPending获知该请求 其余功能与bgw一致 使用示例:...BackgroundWorkerUI; //可以通过bgwUI的一组公开属性和方法更新等待窗体 //bgwUI.CancelControlVisible = true;//设置取消任务的控件的可见性...(i = Convert.ToInt32(e.Argument); i <= 100; i++) { if (bgwUI.CancellationPending)//老样子,访问...先看类图: 类图可看出bgwUI是继承于bgw的子类。

1.7K30

浅谈.Net异步编程的前世今生----EAP篇

创建WinForm后,放入Label控件用于展示下载进度和其他信息,并加入两个Button按钮,分别为开始下载和取消下载,再放入我们的主角:BackgroundWorker组件,如图所示: 在加入这些基本组件后..._DoWork(object sender, DoWorkEventArgs e) { System.ComponentModel.BackgroundWorker...在EAP模型中,执行RunWorkerAsync方法后,会触发backgroundWorker1_DoWork事件。...我们来一起看看在backgroundWorker1_DoWork事件中记录的日志: 通过日志我们发现,EAP与APM一样,也使用了线程池中的线程,不得不感叹一句,线程池是个伟大的发明,微软真是无所不用其极啊...由于这个过程是异步的,因此我们在backgroundWorker1_DoWork事件中不断判断CancellationPending属性,若取消则设置e.Cancel=true进行标志位标志,标志后我们可以在

42520

从零开始搭建一个GIS开发小框架(九)——WPF进度条效果

我这次用的POI数据大概有90W条,这个目录树是我为了练手,故意拆成五层的,其实第三层到第五层原本是放在一个字段里的string型POI类型描述,将它拆解成三层树结构时损耗了部分性能,到最下面一层(图标是感叹号...)类型,大概有5700多个叶子节点,加载这个资源目录树需要一段时间,这里用委托实现页面传值+BackgroundWorker实现异步弹框进度条效果。...弹框代码示例 // 文本框赋值方法 的委托属性 private LoadDataEventHandler _loadDataSubWindowDel; BackgroundWorker worker =...worker.WorkerReportsProgress = true; //注册滚动条事件 worker.ProgressChanged += ProgessChangedInit; //注册任务 worker.DoWork...FormMainProgressBarResult re = (FormMainProgressBarResult)e.Result; this.Close(); //委托返回值给父窗口

46330
领券