操作系统为了提高效率将一个进程分成多个线程。有一个主线程其他的都为子线程,在认识多线程前,我们的代码都是在主线程中执行的。都有一个规则就是 必须执行当前代码才会执行之后的代码。那么问题就来了,假如说有一个非常耗时的操作,比如加载数据或文件下载,难不成数据加载完之前,之后的代码以及其他代码都不执行吗?我们用过不少软件,比如迅雷、百度云,在下载文件的时候还可以进行其他操作,程序不会因为当前任务没执行完而停止。这就运用到了线程。如果将一个耗时10秒的操作放到主线程中,当程序执行到这段代码的时候就会卡机,也就是程序未响应。一种方法是用户等待10秒后让程序执行完,但大多数用户会选择后者:关闭程序。

一、Thread 类:(System.Threading.Thread)

表示托管线程,运行在.NET平台之上的,每一个Thread对象代表一个线程,多线程开发就有多个Thread对象。每一个线程都对应着一个任务(方法)。

二、示例代码;该窗体有3个控件一个label,两个button

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;namespace Csharp窗体练习
{public partial class Form1 : Form{  public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}private int count = 0;private void btnCounter_Click(object sender, EventArgs e){Thread objThread = new Thread(delegate()  {for (int i = 0; i < 5; i++){Thread.Sleep(1000);if (label1.InvokeRequired){label1.Invoke(new Action((s,num) => { label1.Text = s+num;  }) , count.ToString(),i);}}});objThread.IsBackground = true;objThread.Start();count++;}private void btnClear_Click(object sender, EventArgs e){count=0;}}
}

首先第一步是创建Thread 对象: Thread objThread=new Thread(<参数>);Thread构造方法中有参数,可以选中Thread按F1查看帮助文档.翻开这些参数的定义:

public delegate void ParameterizedThreadStart(object obj
)

ParameterizedThreadStart其实就是一个无返回值带参数的一个委托。

public delegate void ThreadStart()

当然这就是一个无参数的委托。总结起来就是Thread构造方法里要放一个委托...所以上述使用了匿名方法当然也可以使用lambda表达式在匿名方法里写要操作的内容。

之后别忘了把线程IsBackground 属性设为true,默认为前台线程,设为true时为后台线程。前台线程与后台线程的区别是,应用程序必须在所有前台线程完成后才关闭,而后台线程,应用程序可以不考虑后台线程是否执行完,应用程序关闭后台线程自动关闭。如果你关闭了某个应用程序,但是在进程中发现该应用程序还在运行,说明该程序的前台进程还在运行。要么是编程的时候不注意,也有可能是流氓软件。

最后把线程start就可以了。

但是,在子线程中无法直接访问主线程的可视化控件,主线程和子线程就像各部门一样,做自己的事情,但是想随意访问内部消息是不允许的。虽然不能直接访问但是能间接访问呐,便可以使用Invoke()方法来实现。   Invoke(<delegate method>,object  args[]) ,第一个参数是通过委托调用的方法,之后的参数都是传给这委托的参数的值。在此之前判断InvokeRequired 是否必须调用Invoke方法。

Invoke方法第一个参数我用了Action。Action和Func都内置了委托,Action为无返回值的匿名方法,而Func有返回值   Func<参数1,参数2...,参数n,返回值>,除最后一个是返回值,之前的都是要传给方法的参数.

C#语法:多线程编程(Thread)相关推荐

  1. Python实战之多线程编程thread模块

    Python实战之多线程编程thread模块 在Python中除了可以通过继承threading.Thread类来实现多线程外,也可以调用thread模块中的start_new_thread()函数来 ...

  2. Android开发之多线程编程Thread和Runnable使用

    Android开发之多线程编程Thread和Runnable使用 Android可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:前者只要继承了Thread类同时覆写了 ...

  3. 进程、线程及python的多线程编程

    目录 一.进程.线程和并行执行 1.什么是进程.线程 注意 2.什么是并行执行 二.python的多线程编程 threading模块 语法 多线程编程的传参 演示 三.总结 一.进程.线程和并行执行 ...

  4. C++多线程编程实战01:std::thread

    C++多线程:std::thread 文章目录 C++多线程:std::thread 定义 构造函数 析构函数 赋值操作函数 join与datch 例子 例子 其它 基本用法 线程参数 等待线程完成( ...

  5. C 多线程编程之在类中使用多线程(thread)的方法

    一.thread的基本用法 参见C++使用thread类多线程编程 . 二.类外使用多线程,访问类的成员 这几种方式,新建线程都是在类外,然后通过把友元函数或者成员函数作为thread参数. #inc ...

  6. C++使用thread类多线程编程

    目录 pthread多线程 系统自带CreateThread std::thread c++ 多线程总结_jacke121的专栏-CSDN博客 std thread比较好用,但是系统带的socket不 ...

  7. C#多线程编程介绍——使用thread、threadpool、timer

    C#多线程编程介绍--使用thread.threadpool.timer 在system.threading 命名空间提供一些使得能进行多线程编程的类和接口,其中线程的创建有以下三种方法:thread ...

  8. Java多线程编程:变量共享分析(Thread)

    Java多线程编程:变量共享分析(Thread) Java 创建线程的两种方法 此处只简单讲下自己对java多线程变量共享的理解: 按照进程和多线程的原理,同一进程内的多个线程之间的地址空间是共享的( ...

  9. iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)

    简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...

最新文章

  1. 样式集(一) 通用商品列表样式
  2. 如果要存ip地址,用什么数据类型比较好?
  3. keil复制代码乱码_win7系统下Keil复制中文注释到记事本出现乱码的解决方法
  4. 5G UE — USIM Card — 5G 的 USIM 卡
  5. 2.1 DNS服务介绍和安装
  6. 【Win32汇编】测试Irvine32库
  7. 为自己尝试写点东西吧,程序员们!(转)
  8. 从前,小夕种了一棵树
  9. 华为新系统 鸿蒙,旗舰CPU+鸿蒙OS!华为Mate家族重磅新品来袭
  10. 统计带头结点的单向链表的个数并存放在形参n所指的单元中。 欢迎评论 指点。
  11. 人脸识别版本目前的问题
  12. 记风雨兼程的2020年,2021年,我来了!
  13. python科学计算-python科学计算
  14. 企业微信API群机器人配置
  15. AE Face Tools 4 脸部工具扩展(中英对照)
  16. 加快二代支付系统建设改进央行支付清算服务
  17. 2015070610 - 看到很多所谓的大牛
  18. Jay的小迷弟-字符串溢出处理取模例题
  19. ipad iphone开发_如何在iPhone或iPad上恢复已删除的照片
  20. 如何在sRGB和CIEXYZ之间进行转换

热门文章

  1. .NET 环境中使用RabbitMQ
  2. 敏捷软件开发实践-Sprint Setup Meeting
  3. 直击面试现场:神级程序员仅100秒,60行代码写出俄罗斯方块,成为全公司焦点!...
  4. Linux虚拟机安装及与宿主机相互通信
  5. [经典算法] 河内塔
  6. 弹出键盘windowsoftinputmode属性设置值
  7. FPGA学习及设计中的注意事项
  8. 【IDEA】干掉注释自动在行首
  9. ubuntu21.04中文冒号变乱码问题解决
  10. linux只读挂载,读写挂载