首页
学习
活动
专区
工具
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事件中访问窗口控件的方法。希望对你有所帮助!如果你对云计算或其他相关话题有更多问题,欢迎继续提问。

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

相关·内容

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

今天借GIS项目实现一个进度条效果,这个效果在各种管理系统中是最常见的一个效果,特别是在处理某个任务消耗的时间过长的场景,可以避免UI假死,提高用户体验。我这次用的POI数据大概有90W条,这个目录树是我为了练手,故意拆成五层的,其实从第三层到第五层原本是放在一个字段里的string型POI类型描述,将它拆解成三层树结构时损耗了部分性能,到最下面一层(图标是感叹号)类型,大概有5700多个叶子节点,加载这个资源目录树需要一段时间,这里用委托实现页面传值+BackgroundWorker实现异步弹框进度条效果。我原来在winform里面实现过,但是WPF框架里还没做过,拿这个练练手,为今后的工(qiu)作(zhi)任(mian)务(shi)做好技术储备。

03

.NET控件名称缩写一览表「建议收藏」

大家好,又见面了,我是你们的朋友全栈君。标准控件 1 btn Button 2 chk CheckBox 3 ckl CheckedListBox 4 cmb ComboBox 5 dtp DateTimePicker 6 lbl Label 7 llb LinkLabel 8 lst ListBox 9 lvw ListView 10 mtx MaskedTextBox 11 cdr MonthCalendar 12 icn NotifyIcon 13 nud NumeircUpDown 14 pic PictureBox 15 prg ProgressBar 16 rdo RadioButton 17 rtx RichTextBox 18 txt TextBox 19 tip ToolTip 20 tvw TreeView 21 wbs WebBrowser 容器控件 1 flp FlowLayoutPanel 2 grp GroupBox 3 pnl Panel 4 spl SplitContainer 5 tab TabControl 6 tlp TableLayoutPanel 菜单和工具栏 1 cms ContextMenuStrip 2 mns MenuStrip 3 ssr StatusStrip 4 tsr ToolStrip 5 tsc ToolStripContainer 数据 1 dts DataSet 2 dgv DataGridView 3 bds BindingSource 4 bdn BindingNavigator 5 rpv ReportViewer 对话框 1 cld ColorDialog 2 fbd FolderBrowserDialog 3 fnd FontDialog 4 ofd OpenFileDialog 5 sfd SaveFileDialog 组件 1 bgw BackgroundWorker 2 dre DirectoryEntry 3 drs DirectorySearcher 4 err ErrorProvider 5 evl EventLog 6 fsw FileSystemWatcher 7 hlp HelpProvider 8 img ImageList 9 msq MessageQueue 10 pfcPerformanceCounter 11 prcProcess 12 sptSerialPort 13 sclServiceController 14 tmrTimer 印刷 1 psd PageSetupDialog 2 prd PrintDialog 3 pdc PrintDocument 4 prv PrintPreviewControl 5 ppd PrintPreviewDialog 水晶报表 1 crv CrystalReportViewer 2 rpd ReportDocument 其他 1 dud DomainUpDown 2 hsc HScrollBar 3 prg PropertyGrid 4 spl Splitter 5 trb TrackBar 6 vsc VScrollBar

01

Android开发笔记(一百八十八)工作管理器WorkManager

Android11不光废弃了AsyncTask,还把IntentService一起废掉了,对于后台的异步服务,官方建议改为使用工作管理器WorkManager。 其实除了IntentService之外,Android也提供了其它后台任务工具,例如工作调度器JobScheduler、闹钟管理器AlarmManager等等。当然这些后台工具的用法各不相同,徒增开发者的学习时间而已,于是乎谷歌索性把它们统一起来,在Jetpack库中推出了工作管理器WorkManager。这个WorkManager的兼容性很强,对于Android6.0或更高版本的系统,它通过JobScheduler完成后台任务;对于Android6.0以下版本的系统(不含Android6.0),通过AlarmManager和广播接收器组合完成后台任务。不过无论采取哪种方案,后台任务最终都是由线程池Executor执行。 因为WorkManager来自Jetpack库,所以使用之前要修改build.gradle,增加下面一行依赖配置:

03
领券