什么是多线程?我们在建立以个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();

滴水穿石 C#中多线程 委托的使用的更多相关文章

  1. C#中多线程 委托的使用

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

  2. WinForm中 事件 委托 多线程的应用

    WinForm中 事件 委托 多线程的应用[以一个下载进度条为例] 第一步:首先我们创建一个winfor的项目 第二步:我们建一个窗体在一个窗体里面 打开一个另外的窗体 另外的窗体有一个按钮 点击后就 ...

  3. C# winform编程中多线程操作控件方法

    private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...

  4. 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)

    一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...

  5. iOS中多线程知识总结(一)

    这一段开发中一直在处理iOS多线程的问题,但是感觉知识太散了,所以就把iOS中多线程的知识点总结了一下. 1.基本概念 1)什么是进程?进程的特性是什么? 进程是指在系统中正在运行的一个应用程序.   ...

  6. 2.C#中通过委托Func消除重复代码

    阅读目录   一:重复的代码 二:C#中通过委托Func消除重复代码 一:重复代码    public class Persion { public string Name { get; set; } ...

  7. c++中实现委托

    成员函数指针与高性能的C++委托(上篇) 撰文:Don Clugston 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(clo ...

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

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

  9. iOS 中多线程的简单使用

    iOS中常用的多线程操作有( NSThread, NSOperation GCD ) 为了能更直观的展现多线程操作在SB中做如下的界面布局: 当点击下载的时候从网络上下载图片: - (void)loa ...

随机推荐

  1. RabbitMQ之Exchange Topics模式

    说明:此模式实在路由key模式的基础上,使用了通配符来管理消费者接收消息.生产者P发送消息到交换机X,type=topic,交换机根据绑定队列的routing key的值进行通配符匹配: 符号#:匹配 ...

  2. Spark- Action实战

    Spark- Action实战 package cn.rzlee.spark.core import org.apache.spark.rdd.RDD import org.apache.spark. ...

  3. html布局 左右固定,中间只适应,三种方法实现

    html布局 左右固定,中间只适应,三种方法实现 使用自身浮动法定位 //html <h3>使用自身浮动法定位</h3> <div id="left_self& ...

  4. a note of R software write Function

    Functionals “To become significantly more reliable, code must become more transparent. In particular ...

  5. kaggle 欺诈信用卡预测——不平衡训练样本的处理方法 综合结论就是:随机森林+过采样(直接复制或者smote后,黑白比例1:3 or 1:1)效果比较好!记得在smote前一定要先做标准化!!!其实随机森林对特征是否标准化无感,但是svm和LR就非常非常关键了

    先看数据: 特征如下: Time Number of seconds elapsed between each transaction (over two days) numeric V1 No de ...

  6. 2013面试C++小结

    2013年我在厦门c++求职小结 1.一般公司出的面试题目中的找错误,都是出自平常公司内部使用过程中出现的真实错误. 比如stl 中erase的使用:详细请见 :http://blog.csdn.ne ...

  7. 计算机_网络_01_配置IE代理

    一.配置代理 1.打开代理设置 打开chrome浏览器设置->高级设置->系统->打开代理设置 2.打开局域网设置 Internet属性->连接->局域网设置 3.配置代 ...

  8. Oracle忘记用户名密码

    一.oracle 11g登录服务开启 成功安装Oracle 11g后,共有7个服务,这七个服务的含义分别为:1. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写 ...

  9. BZOJ4974 大视野1708月赛 字符串大师

    传送门 题目大意 给定一个字符串的每一个前缀的最短循环节长度,求符合要求的字典序最小的字符串. 题解 给定循环节最短长度就是给定了这个字符串$kmp$的$next$数组,即$X_i=i-next_i$ ...

  10. 洛谷【P1104】生日(选择排序版)

    题目传送门:https://www.luogu.org/problemnew/show/P1104 题目很简单,不过我是来讲选择排序的. 选择排序\((Selection sort)\)是一种简单直观 ...