C#为什么多线程控制winform需要用委托?比如我新起了一个线程A,在A线程里要对winform的list控件里显示数据,我需要用一个委托函数来实现。
因为winform是主线程创建的,你用另外一个线程来调用它就可能会出现两个线程同时访问同一个资源的问题,这个时候很容易出现错误,比如A线程改变窗口的颜色为红色,B线程取窗口的颜色,如果这两个线程正好碰到一起,可能A略先于B,那么就是B取出来的红色,如果略后于那么就是原来的颜色,而这和CPU的繁忙度、时间片的轮转是相关的,是一种随机的情况,那么B取出来的颜色就不可靠了,因此为了避免这种状况采用委托,B线程向A线程发出委托,由A线程来完成取色工作,那么可以保证取色工作的稳定性,结果也可靠

如果你实在想通过另一个线程访问winform,可以在窗口的构造函数中加入
Control.CheckForIllegalCrossThreadCalls = false;
这样可以屏蔽这个错误,不过建议还是用委托

这需要用到委托.
你先声明一个委托,然后,把一个操作界面的函数托给他.
你的线程里只要调用这个委托就可以了.
C#试写一个多线程问题(委托,Invoke(),beginInvoke())
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Diagnostics;

namespace _
{
        public partial class Form1 : Form
        {
                public delegate void del(string str);
                public delegate void del1(string str1);
                Thread thread1,thread2;
                public Form1()
                {
                        InitializeComponent();
                }

                private void button1_Click(object sender, EventArgs e)
                {
                        this.thread1 = new Thread(new ThreadStart(this.sa));
                        this.thread1.Start();
                        //MessageBox.Show(this,);
                        this.button1.Enabled = false;
                        //获取当前的线程好
                        int thread1id = Thread.CurrentThread.GetHashCode();
                        string strThreadId = Convert.ToString(thread1id);
                        MessageBox.Show(this,strThreadId);
                }                

                private void progressSet(string text)
                {
                                progressBar1.Value = 0;
                                progressBar1.Maximum = 999999;
                                for (int i = 0; i < 999999; i++)
                                {
                                        progressBar1.Value++;
                                }
                                progressBar1.Value = 0;                        
                }

                private void sa()
                {
                        del pro = new del(progressSet);
                        this.Invoke(pro, new object[] { "hello" });
                }

                private void button2_Click(object sender, EventArgs e)
                {
                        this.thread2 = new Thread(this.sa1);
                        thread2.Start();
                        this.button2.Enabled = false;
                        //获取当前的线程好
                        int thread2id = Thread.CurrentThread.GetHashCode();
                        string strThreadId = Convert.ToString(thread2id);
                        MessageBox.Show(this, strThreadId);
                }

                private void sa1()
                {
                        //其他操作    
                        //比如将界面的TextBox内容设置一下    
                        del1 mi1 = new del1(UpdateTextBox);
                        this.Invoke(mi1, new object[] { "我是一个文本框" });
                }

                //更新界面的方法    
                private void UpdateTextBox(string str)
                {
                        //更新    
                        this.textBox1.Text = str;
                }
        }
}

转载于:https://blog.51cto.com/lovefly/274505

C#为什么多线程控制winform需要用委托?相关推荐

  1. c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。...

    首先来看传统方法: public partial class Form1 : Form{public Form1() { InitializeComponent(); } private void F ...

  2. WinCE5.0移动平台开发笔记(c#中使用多线程访问winform中控件的若干问题(zt))

    本文转载于:http://www.cnblogs.com/zhaotiantang/archive/2009/03/17/1414135.html 我们在做winform应用的时候,大部分情况下都会碰 ...

  3. [转] c#中 多线程访问winform控件

    原文 c#中多线程访问winform控件的若干问题小结 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来解决这个问题,下面我将详细的 ...

  4. C#中使用多线程访问Winform问题解决方案

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial ...

  5. c#中使用多线程访问winform中控件的若干问题

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial ...

  6. ATL是如何实现线程安全的引用计数和多线程控制的

    ATL是如何实现线程安全的引用计数和多线程控制的 正如标题所示,这是我经常被问到的一个问题,而每次我都从头开始给人说一次,其实说来过程理解起来的确有点复杂. 我们的每一个ATL Server Obje ...

  7. 基于qtLED呼吸灯程序(多线程控制)---全CSDN独家

    本次实验是基于基于qtLED呼吸灯程序(多线程控制),大家都知道呼吸灯都是用pwm波来控制输出电压的大小来控制呼吸灯的一闪一灭来实现呼吸的效果,开呼吸灯程序免不了用while死循环,嵌入式必备程序wh ...

  8. 遨博机器人执行线程_遨博机器人报错代码:多线程控制命令Thread和脚本命令Script...

    11.7 高级条件条件命令 11.7.1  多线程控制命令Thread Thread 是多线程控制命令.在 Thread 程序段里,必须有一个 Loop 循环命令,在该Loop 循环中,可以实现与主程 ...

  9. WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】

    第一步:首先我们创建一个winfor的项目 第二步:我们建一个窗体 在一个窗体里面 打开一个另外的窗体 另外的窗体有一个按钮 点击后就开始下载 下载完成后 在注册窗体上面 显示下载完成(达到在一个窗体 ...

最新文章

  1. 【转】该帐户当前被锁定,所以用户 'sa' 登录失败。系统管理
  2. poj 1324(BFS+状态压缩)
  3. 个人笔记 Vue.js, Framework7, and Cordova / PhoneGap Template with Babel, Webpack and Hot Reloading...
  4. JVM-对象的存活与死亡
  5. python视频延迟严重_利用多进程降低opencv视频延迟处理rtsp视频流
  6. 如何将一个目录下的所有文件,合并成一个文件
  7. 中科大计算机是一流学科吗,2016安徽省大学一流学科排行榜,中科大第一
  8. linux环境搭建pypi源,使用pypi-server搭建简单的PyPI源
  9. 词汇的积累与遣词造句 —— 准确的表达、新鲜的词汇
  10. [求助]关于服务器之间的文件拷贝问题,没有头绪,希望大家指点一二
  11. mysql 注入攻击与防御_防御SQL注入和XSS攻击
  12. 深蓝学院【视觉SLAM十四讲】汇总
  13. 记一次 打包报错:Keystore was tampered with, or password was incorrect
  14. Java主要就业方向有哪些?
  15. oracle下k M G,【性能调优】Oracle AWR报告指标全解析(2)
  16. 小程序引入字体集方式
  17. 厦门明发家乐福免费班车行车线路和时间表
  18. 丢手帕问题 java_java入门小程序—17人游戏(丢手绢问题) | 学步园
  19. Ncut源码编译错误的解决方法
  20. 17.6:迪瑞克斯啦算法

热门文章

  1. day7 python学习随笔
  2. Kerberos验证过程
  3. 使用jvisualvm.exe 的Btrace插件监控应用程序
  4. 整理大型网站架构必知必会的几个服务器知识
  5. 问题分析探讨 -- 大约有700W数据的表,把当天的10W数据select导入新表,整个原来的表就锁死...
  6. java中web应用中重定向与转发的区别
  7. 微信小程序 跳转界面
  8. php mysql 非扫描,PHP的中使用非缓冲模式查询数据库的方法
  9. 2021甘肃高考艺考成绩查询,2021甘肃艺术统考/联考成绩查询时间及入口
  10. personal-index 我的个人主页的介绍