C#编程中的报错解决System.InvalidOperationException

2023-10-27

问题场景

在C# Windows GUI编程中,从某个子线程去访问设计器中的某个控件,例如将某个按钮禁用。这样就会触发该异常:

System.InvalidOperationException:"线程间操作无效: 从不是创建控件"btn_exp"的线程访问它。"

问题原因

在C# Windows GUI编程中有一个规则,就是只能通过创建控件的线程来访问控件,否则就可能产生不可预料的结果。

解决方案

方案一,打破规则

在构造函数中加入以下语句:

Control.CheckForIllegalCrossThreadCalls = false;

将以上属性设置为假则会取消对非法跨线程调用进行检查,简单粗暴但不保证不出错。

方案二,利用委托(Delegate)

.net为我们提供了Invoke 方法与BeginInvoke方法去调用委托,它们的区别在于前者是线程阻塞的,后者是异步的。因此当委托是一个较为耗时的函数时,Invoke 方法就会导致线程阻塞,表现为用户界面卡顿;而BeginInvoke方法则不会等待委托执行完毕。虽然BeginInvoke方法不会导致线程阻塞,但可以使用EndInvoke方法或者其它类似WaitHandle机制等待异步操作的完成。

BeginInvoke(new MethodInvoker(()=>
{
    btn_exp.Enabled = false;
}));

其中,MethodInvoker委托 与EventHandler 委托的区别在于前者是不带参数的:

public delegate void MethodInvoker();
public delegate void EventHandler(object sender, EventArgs e);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#编程中的报错解决System.InvalidOperationException 的相关文章

随机推荐

  • 基于openwrt的wifi 渗透

    背景 使用路由器刷了 openwrt的固件 然后尝试破解wpa等wifi的密码 配置好网络之后 使用ssh连接路由器 测试连通性 0 ping downloads openwrt org root OpenWrt ping download
  • java中的锁面试题

    1 多线程中 synchronized 锁升级的原理是什么 synchronized 是 JVM 层面的锁 是 Java 关键字 通过 monitor 对象来完成 synchronized 的实现涉及到锁的升级 具体为无锁 偏向锁 自旋锁
  • 正式使用rem

    需求 移动端推广页面 需要嵌入到微信公众号 现况 之前全部都用绝对单位 没有认真使用过相对单位rem 看了一些购物网站都在用rem 于是这次完全使用了rem写页面 目的 实际检测rem布局效果 安卓和ios分辨率不一样 导致字体大小也不一样
  • Kafka生产者与消费者api示例

    生产者api示例 一个正常的生产逻辑需要具备以下几个步骤 配置生产者参数及创建相应的生产者实例 构建待发送的消息 发送消息 关闭生产者实例 采用默认分区方式将消息散列的发送到各个分区当中 package com doitedu import
  • Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springfr

    今天写springboot的项目时报错 Error starting ApplicationContext To display the auto configuration report re run your application w
  • 怎样在计算机上注册dll文件,注册dll文件【搞定步骤】

    喜欢使用电脑的小伙伴们一般都会遇到win7系统注册dll文件的问题 突然遇到win7系统注册dll文件的问题就不知道该怎么办了 其实win7系统注册dll文件的解决方法非常简单 按照 1 在电脑桌面上 依次选中菜单项开始 运行 打开运行窗口
  • PCL学习笔记:PCL的初次安装和使用。

    注 资料来源 D 项目资料 YC 激光扫描建模 长沙项目 2016 2019 2017 2018 文档资料 技术总结YC 201703 YC 激光建模技术总结 201703及以后 docx 目录 A PCL的初步安装及测试 0 安装平台 1
  • Ubuntu换源+VMware Tools安装

    Contents 1 Ubuntu20 04换国内源 1 1 备份文件 1 2 修改配置文件 1 3 更新 2 VMware Tools安装 2 1 解决安装VMwareTools显示灰色 2 2 正式安装 复制压缩文件至 opt 切换为r
  • python的cls,self,classmethod,staticmethod

    python的cls self classmethod staticmethod python类里会出现这三个单词 self和cls都可以用别的单词代替 类的方法有三种 一是通过def定义的 普通的一般的 需要至少传递一个参数 一般用sel
  • 【满分】【华为OD机试真题2023 JAVA&JS】最差产品奖

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 最差产品奖 知识点滑窗 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 A公司准备对他下面的N个产品评选最差奖 评选的方式是首先对每个产品进行评分 然后根据评分区
  • Chapter 1 Introduction

    Chapter 1 Introduction focus on communication and queueing systems formulated problem optimize the time averages of cert
  • 使用python实现短线选股

    经常做短线的朋友都知道 选股是个较为复杂的工作 尤其是像我们这种非职业选手 下面就分享一些通过python实现选股的思路 股票信息获取 炒短线离不开龙虎榜 我们先来通过龙虎榜来进行股票选择 url https applhb longhuvi
  • 数据结构和算法(5)-----树

    一 哈夫曼树 基本介绍 给定n个权值作为n个叶子结点 构造一棵二叉树 若该树的带权路径长度 wpl 达到最小 称这样的二叉树为最优二叉树 也称为哈夫曼树 Huffman Tree 还有的书翻译为霍夫曼树 赫夫曼树是带权路径长度最短的树 权值
  • 【JS算法系列】1.翻转字符串的四种方法

    1 使用数组的 reverse 方法 let str hello let reversed str split reverse join olleh 2 从字符串的尾部开始迭代 并逐个添加字符到新的字符串中 let str hello le
  • qt打包应用程序

    cannot find gcc installation directory g exe must be in the path http t csdn cn d5yaf
  • 期权酱也来说说期权双卖策略原理

    期权option 又称选择权 是一类衍生品合约 买方支付权利金给卖方之后 买方有权在未来的特定日期或之前 以特定的价格向卖方买入或卖出标的资产的权利 下文介绍期权酱也来说说期权双卖策略原理 本文来自 期权酱 期权的本质简单说就是买方支付权利
  • 自己挖坑自己填,谷歌大改Transformer注意力,速度、内存利用率都提上去了

    点击上方 AI遇见机器学习 选择 星标 公众号 重磅干货 第一时间送达 来自 机器之心 考虑到 Transformer 对于机器学习最近一段时间的影响 这样一个研究就显得异常引人注目了 Transformer 有着巨大的内存和算力需求 因为
  • 挖掘机整体(2012.11.30)

    将近1周 终于把整体搞定了 这周的问题所在就是由于 180 ANGLE或者180 ANGLE的余弦值都相同 所以才会来回晃 我用了ASINF反正弦
  • Spring 框架学习—控制反转(IOC)

    Spring是一个开源框架 Spring是于2003 年兴起的一个轻量级的Java 开发框架 由Rod Johnson创建 简单来说 Spring是一个分层的JavaSE EEfull stack 一站式 轻量级开源框架 主要用于降低模块之
  • C#编程中的报错解决System.InvalidOperationException

    C 编程中的报错解决System InvalidOperationException 问题场景 问题原因 解决方案 方案一 打破规则 方案二 利用委托 Delegate 问题场景 在C Windows GUI编程中 从某个子线程去访问设计器