背景: 
什么是多线程?我们在建立以个C#项目时,往往会在Form1上添加控件,然后写代码,初
学者都是在重复这个过程,其实这个过程是单线程的,可以理解为只有“main”主线程,有
的时候往往需要同时测量多个东西,比如说在扫面局域网主机时,如果按一个一个主机的IP
去扫描,会很浪费时间,因为当一个主机未开机,会对这个主机等待一直到超时。如果建立
多个线程,让所有的IP 扫描分配给不同的线程去执行,因此会节省很多时间,尤其是扫面
的IP段主机大部分没开机,和单线程比花费的时间差很多。 
 
 
因为我也是初学者,谈的很肤浅,关于进程、线程的概念还是去看高手的理解吧。不过有一
点,多线程未必会比单线程节省时间,上面的例子是节省时间的例子之一,但并不是说所有
多线程的程序比单线程程序节省时间。这要分情况看。 
 
下面说一下怎么使用多线程。(将在后面附有例子) 
第一步:在主程序前加上using system.threading 
第二部:线程实例化,一般是在主程序最前端声明thread    thread1; 
第三部:在调用线程的方法中给线程分配内存,准备启动线程  thread1=  new  thread(方法
名)方法名指的是线程的入口,即要执行的方法。然后启动线程:thread1.start(); 
第四步:终止线程 
终止线程有两种方法,一种是使用建立公共布尔类型,在线程内部时刻检查布尔值,通过在
外界改变布尔类型的值,来控制线程的结束。 
第二种是强制退出线程,即调用thread1..abort();与此方法连用的是thread1.join();为什么要
连用呢?因为虽然线程强制退出,但是并不知道线程终止的具体时间,所以把强制退出的线
程合并到主线程中来。值得注意的是线程强制退出后不能够用thread1.Resume()重启线程。
所以强制线程退出的方法慎用。 
 
什么是委托呢?举一个最实用的例子,刚才是不是已经知道建立多线程了,但是自己建立的
线程时不能访问其他线程的东西,比如说自己建立的线程是不能访问窗体上的任何控件,但
是自己建立的线程很想用到窗体中的控件怎么呢?那就用委托吧。委托时系统专门用作协调
线程之间的关系的。 
委托的定义 
Delegate  (返回值类型)delegatename(委托名称)(参数列表) 
例子:delegate void list(); 
    Delegate string name(string s); 
委托实例化 
list list1; 
list1=new list(方法名); 
 
调用委托 
此时委托list1 将作为调用委托的方法的一个参数。如listBox1.Invoke(list1); 

下面是一个涉及线程和委托综合的小例子。

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Threading;//使用多线程的声明(准确的说是要在main主线程中建立新的线程时要进行的引
    public partial class Form1 : Form 
        public static int Num = 0; 
        Thread thread1; //在主线程中声明线程1 
        Thread thread2; //在主线程中声明线程2 
        daililist list1;//委托实例化,即建立委托对应的事件 
            InitializeComponent(); 
            list1 = new daililist(updatelist);//委托处理的方法,这里updatelist是一个方法,这个句子的意思是把updatelist这个方法交给了list1这个委托实例 
            thread1 = new Thread(numadd );

thread1.Start(); 
            thread2.Start(); 
        public void updatelist() 
            listBox1.Items.Add (Num) ; 
        public void numadd() 
            Num ++; 
listBox1.Invoke(list1);//这是自己建立的线程要调用的方法,但是listbox1是main主线程建立的控件,自定义的线程无法直接访问,上面已经定义了委托,此处应用listbox1的invoke 
//到此我们理一下思路,建立线程thread1、thread2,这两个线程都指向了numadd这个方法,首先都执行Num++,然后执行listBox1.Invoke(list1),意思是说将要对listbox1操作, 
        private void button2_Click(object sender, EventArgs e) 
            thread1.Join(); 
            thread2.Abort(); 
        } 
    } 
}

using System.Collections.Generic;
using System.Data;
using System.Linq;
用说明) namespace mytest
{ { delegate void daililist();//主线程之外的线程要调用main线程中建立的控件,需要使用委托的方式,此处是委托的定义 public Form1() { } private void button1_Click(object sender, EventArgs e) { thread2 = new Thread(numadd); } { } {
//方法把所有对listbox1的操作都交给委托list1去处理。
//但是具体操作在list1这个委托当中,然后这个委托指向了updatelist并执行,至此thread1、thread2都完成了对listbox1的操作! } { thread1.Abort(); thread2.Join(); 

转载于:https://www.cnblogs.com/suncoolcat/p/3292309.html

C#中多线程 委托的使用相关推荐

  1. 滴水穿石 C#中多线程 委托的使用

    什么是多线程?我们在建立以个C#项目时,往往会在Form1上添加控件,然后写代码,初 学者都是在重复这个过程,其实这个过程是单线程的,可以理解为只有"main"主线程,有 的时候往 ...

  2. 《C#多线程编程实战(原书第2版)》——3.2 在线程池中调用委托

    本节书摘来自华章出版社<C#多线程编程实战(原书第2版)>一书中的第3章,第3.2节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问 ...

  3. Qt中多线程间的同步

    文章目录 1 Qt中多线程间的同步 1 Qt中多线程间的同步 多线程编程的本质是什么? 并发性是多线程编程的本质. 在宏观上,所有线程并行执行. 多个线程间相互独立,互补干涉. 常规解决方案设计: 问 ...

  4. Python 中多线程共享全局变量的问题

    Python 中多个线程之间是可以共享全局变量的数据的. 但是,多线程共享全局变量是会出问题的. 假设两个线程 t1 和 t2 都要对全局变量 g_num (默认是0)进行加1运算,t1 和 t2 都 ...

  5. Delphi中多线程用Synchronize实现VCL数据同步显示

    概述: VCL实现同步的另一种方法就是调用线程类的Synchronize的过程,此过程需要一个无参数的procedure,故在此procedure中无法传递参数值,但可以通过类的成员来实现.在类的Ex ...

  6. python3多线程异步爬虫_python3爬虫中多线程进行解锁操作实例

    生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开.同样的之间我们讲过多线程中的lock,作用是为了不让多个线程运行是出错所以进行锁住的指令.但是鉴于我们实际运 ...

  7. python爬虫多线程是什么意思_python爬虫中多线程的使用详解

    queue介绍 queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue.python3直接queue即可 在python中,多个线程之间的数据 ...

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

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

  9. 【Python SQLAlchemy】数据库连接池SQLAlchemy中多线程安全的问题

    问题描述 写了一个apscheduler定时任务 里面用到SQLAlchemy在同一时间点开启了18个任务,用于更新18个表 但是最终看数据库表的时候,发现有2个表未更新.查看打印日志均正常,查找原因 ...

最新文章

  1. richeditctrl 选中ole图片 拖拽 空白_高质量的图片素材,碾压度娘几条街......
  2. Nature 首度揭示大脑传递信息的真正逻辑
  3. Linux 内核将要支持最新龙芯 3A2000/3B2000
  4. OstrichNet 简易统计信息收集工具
  5. 基于matlab 系统仿真学报,基于MATLAB/Simulink的混合动力汽车正向仿真软件的开发...
  6. Linux Unix shell 编程指南学习笔记(第五部分)
  7. Grunt的配置及使用(压缩合并js/css)
  8. AcWing 1750. 救生员(差分+暴力枚举)
  9. 不要被C++“自动生成”所蒙骗
  10. JBoss安装与配置
  11. java开源规则引擎比较_几款常用规则引擎的简单对比及演示
  12. 为什么浏览器User-agent(浏览器类型)总是有Mozilla字样?
  13. 计算机图桌面打印出来,桌面图片打印设置方法
  14. 这几天阅读的shadowgun的几个shader
  15. 倾斜摄影实景三维与游戏的结合
  16. 克隆硬盘后进不去系统_Win10怎么快速复制磁盘或克隆磁盘到另一个磁盘上 - 分区助手教程...
  17. OpenStack 虚拟机冷/热迁移功能实践与流程分析
  18. 计算机快捷键打开程序格式,win电脑任务管理器怎么打开?6种方法助你迅速优雅的打开(含快捷键方法)...
  19. 聊聊做码农的这些年,时光飞逝岁月无痕
  20. 微服务多网卡部署(eureka显示IP不为服务IP的地址)解决办法

热门文章

  1. 双向滚动scrollview
  2. 将SmartForms转换为PDF保存到本地
  3. 想客户之所想 华为全栈云加速行业云化创新
  4. 解决“安装VMM过程中无法注册SPN以及SCP”问题一例
  5. 对Mapreduce代码进行单元测试
  6. IDEA创建Web Project图解
  7. 成功网页设计师的七大必备技能
  8. redhat6.4中手动创建oracle11g数据库
  9. PL/SQL程序设计 第一章 PL/SQL 程序设计简介
  10. Unable to find the ncurses libraries or the required header files解决