在C#的多线程访问中,在线程间的相互访问时因为线程安全问题有访问限制,在创建一般线程时,对于界面元素访问时这样的问题比较常见。

  比如,创建一个form1,上面放置一个textbox控件,创建一个线程去访问textbox,界面如下:

  按钮buuton1的代码:

        private void button1_Click(object sender, EventArgs e){var thread1 = new System.Threading.Thread(Func1);thread1.Start();}

  就是简单地创建一个线程,线程里面运行的func1代码:

        private void Func1(){for(int i = 0; i < 5; i++){textBox1.Text = textBox1.Text+ $"线程{Thread.CurrentThread.ManagedThreadId}执行{i}."+Environment.NewLine;}}

  运行,点击button1按钮系统会报错:

  意思是说:线程间操作无效:从不是创建控件“textbox1”的线程访问它,这是不允许的。

  线程存在安全保护机制,并不能随意访问,因为这样存在冲突的可能。

  解决这个问题,最直接的方法是在界面初始化后去掉控件的跨线程非法访问属性,即将Control.CheckForIllegalCrossThreadCalls属性设置为false即可。

        public Form1(){InitializeComponent();Control.CheckForIllegalCrossThreadCalls = false;}

  这样结果就出来了。

  一般情况下,还是不要设置Control.CheckForIllegalCrossThreadCalls的属性,那么怎样可以达到修改textbox1的值呢?

  可以通过委托来解决。

    public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){var thread1 = new System.Threading.Thread(Func1);thread1.Start();}public void SetText(string SText){textBox1.Text = textBox1.Text + SText + Environment.NewLine;}private void Func1(){string Str = "";for (int i = 0; i < 5; i++){Str= $"线程{Thread.CurrentThread.ManagedThreadId}执行{i}."+Environment.NewLine;if (textBox1.InvokeRequired){Action SetText111 = delegate { SetText(Str); };textBox1.Invoke(SetText111);}else{textBox1.Text = Str;}}}}

  这样也可以达到目的,或者直接写更简单:

    public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){var thread1 = new System.Threading.Thread(Func2);thread1.Start();}private void Func2(){textBox1.Invoke(() =>{for (int i = 0; i < 5; i++){textBox1.Text = textBox1.Text+ $"线程{Thread.CurrentThread.ManagedThreadId}执行{i}." + Environment.NewLine;}});}}

  效果也是一样的。

  在C#中,需要注意Invoke和begininvoke的区别。

  control.invoke(参数delegate):在拥有此控件的基础窗口句柄的线程上执行指定的委托,注意是同步。
  control.begininvoke(参数delegate):在创建控件的基础句柄所在线程上异步执行指定委托,注意这里执行的是异步。

  在跨线程请求时,常检验textBox1.InvokeRequired属性,即是否跨线程请求。

C#线程间操作无效:从不是创建控件“textbox1”的线程访问它相关推荐

  1. C#线程间操作无效: 从不是创建控件 XX 的线程访问它

    转自:http://www.arasplm.net/index.php/zh/community/myblog/c-xx-.html 前些天做的要使用到线程的项目,现在和大家分享一下感受! 以下面小列 ...

  2. System.InvalidOperationException:“线程间操作无效: 从不是创建控件“txtPortName02”的线程访问它。”...

    "System.InvalidOperationException"类型的未经处理的异常在 System.Windows.Forms.dll 中发生 其他信息: 线程间操作无效: ...

  3. C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它...

    C# 委托 / 跨线程访问UI /  线程间操作无效: 从不是创建控件"Form1"的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 usin ...

  4. C#中线程间操作无效: 从不是创建控件 txtBOX 的线程访问它

    delegate void 委托名(方法名); void 方法名() { if(txtBox.invokeRequered) { 委托名 d=new 委托名(); txtBox.invoke(d); ...

  5. System.InvalidOperationException:“线程间操作无效: 从不是创建控件“label1”的线程访问它。”

    新手在编程时,会遇到跨线程报警.(如用按键去修改textbox数据会报错) 掩耳盗铃的做法是:Control.CheckForIllegalCrossThreadCalls = false; 正确做法 ...

  6. 线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。

    在窗体   load   加入 private void MailDesktop_Load(object sender, EventArgs e) {       Control.CheckForIl ...

  7. 线程间操作无效: 从不是创建控件“button2”的线程访问它

    在项目中经常遇到类似的问题,如何解决呢,报错的方法中添加  Control.CheckForIllegalCrossThreadCalls = false; 就可以解决了. 转载于:https://w ...

  8. 线程间操作无效,从不是创建控件的线程访问它。

    最近在开发项目时用到了操作线程的问题,在新线程中写入了操作控件的代码如: this.btnToolUpload.Enabled = true; 但是在线程执行过程中,当执行到这段代码时提示:" ...

  9. 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析...

    最近,在做一个使用线程控制下载文件的小程序(使用进度条控件显示下载进度)时,遇到这样的问题, 错误显示: 未处理的"System.InvalidOperationException" ...

  10. 黄聪:BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)...

    在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选.这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作 ...

最新文章

  1. HTML和JavaScript函数之间的关系
  2. 《JavaScript高级程序设计》(第2版)上市
  3. MyBatis中多表查询(N+1方式)
  4. 【报告分享】2020解读中国互联网:局部领先、快进的数字化发展.pdf(附下载链接)...
  5. SpringBoot启动错误 If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
  6. [译] iOS 11:机器学习人人有份
  7. 实现关联条件的casewhen效果
  8. python内置函数源码中啥都没有_如何查看python内置函数源码
  9. KDD_2018_notes Smoothed Dilated Convolutions for Improved Dense Prediction
  10. python基础,详细讲解、手把手代做项目。有java语言基础,快速学习python。
  11. 大二Web课程设计——张家界旅游网站设计与实现(HTML+CSS+JavaScript)
  12. 手把手教你如何通过Java给图片添加文字和图片水印
  13. 微软最走运/倒霉的十个瞬间
  14. python运维自动化老男孩_老男孩第十四期 python 自动化运维第二周
  15. 阿里云域名备案和域名解析流程详解
  16. Otter.ai创始人Sam Liang:智能记录你的生活对话
  17. 计算机教师资格教案,小学信息技术教师资格证面试教案:操作系统新相识
  18. 用Matlab求解高等数学中的问题(不定积分,定积分,多元微积分,微分方程,级数问题)
  19. sas入门-笔记4 描述性统计分析
  20. selenium 原理应用 - 利用 requests 模拟 selenium 驱动浏览器

热门文章

  1. 基于联发科(MTK)MT8735平台的安卓4G全网通核心板
  2. 尚学堂Java学习笔记
  3. 《Rethinking Efficient Lane Detection via Curve Modeling》论文笔记
  4. AndroidQ(10)黑暗模式适配
  5. discuz post.PHP目录,详解Discuz论坛目录结构
  6. Gartner发布5G网络基础设施魔力象限报告
  7. css3 wshtml_swoft框架之websocket服务的简单使用
  8. 数据库三大范式详解,部分依赖、完全依赖、传递依赖
  9. 笔记本电脑只能搜索到部分WiFi
  10. [CCFwithAxin]201709-2公共钥匙盒