一、前台线程与后台线程对象

为什么要用多线程?

  1.让计算机“同时”做多件事情,节约时间。

  2.多线程可以让一个程序“同时”处理多个事情。

  3.后台运行程序,提高程序的运行效率,也不会导致主界面出现无响应的情况。

线程

- 前台线程:只有所有的前台线程都关闭才能完成程序关闭。

- 后台线程:只有所有的前台线程结束,后台线程自动结束。(设置方法:线程实例名.IsBackground = true)

1 using System.Threading;

线程命名空间

线程小示例:

 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10 using System.Threading;
11
12 namespace 线程
13 {
14 public partial class Form1 : Form
15 {
16 public Form1()
17 {
18 InitializeComponent();
19 }
20
21 private void button1_Click(object sender, EventArgs e)
22 {
23 // 创建一个线程去执行这个方法
24 Thread th = new Thread(Test);
25 // 标记这个线程准备就绪,可以随时被执行.具体什么时候执行由CPU决定
26 // 前台线程和后台线程
27 // 将线程设置为后台线程
28 th.IsBackground = true;
29 th.Start();
30
31 }
32 public void Test()
33 {
34 for (int i = 0; i < 2000; i++)
35 {
36 Console.WriteLine(i);
37 }
38 }
39 }
40 }
 1 注:
2 在.Net下,不允许跨线程访问
3
4
5 可以在加载的时候,设置不检查线程:
6 private void Form1_Load(object sender, EventArgs e)
7 {
8 // 取消跨线程的访问
9 Control.CheckForIllegalCrossThreadCalls = false;
10 }

注:处理线程抛异常情况(主线程已经释放,副线程还未结束,在窗体关闭时,判断线程的值)

 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10 using System.Threading;
11
12 namespace 线程
13 {
14 public partial class Form1 : Form
15 {
16 public Form1()
17 {
18 InitializeComponent();
19 }
20 public Thread th;
21 private void button1_Click(object sender, EventArgs e)
22 {
23 // 创建一个线程去执行这个方法
24 th = new Thread(Test);
25 // 标记这个线程准备就绪,可以随时被执行.具体什么时候执行由CPU决定
26 // 前台线程和后台线程
27 // 将线程设置为后台线程
28 th.IsBackground = true;
29 th.Start();
30
31 }
32 public void Test()
33 {
34 for (int i = 0; i < 20000; i++)
35 {
36 //Console.WriteLine(i);
37 textBox1.Text = i.ToString();
38 }
39 }
40
41 private void Form1_Load(object sender, EventArgs e)
42 {
43 // 取消跨线程的访问
44 Control.CheckForIllegalCrossThreadCalls = false;
45 }
46
47 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
48 {
49 // 当你点击关闭窗体的时候,判断新线程是否为null
50 if(th!=null)
51 {
52 th.Abort(); // 关闭线程
53 }
54 }
55 }
56 }

注:如果线程执行的方法需要参数,那么这个参数类型必须是object类型

 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10 using System.Threading;
11
12 namespace 线程执行带参数的方法
13 {
14 public partial class Form1 : Form
15 {
16 public Form1()
17 {
18 InitializeComponent();
19 }
20
21 private void button1_Click(object sender, EventArgs e)
22 {
23 Thread th = new Thread(Test);
24 th.IsBackground = true;
25 th.Start("123");
26 }
27 public void Test(object s)
28 {
29 for (int i = 0; i < 2000; i++)
30 {
31 Console.WriteLine(i);
32 }
33 }
34 }
35 }
 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Threading.Tasks;
9 using System.Windows.Forms;
10 using System.Threading;
11
12 namespace 线程之摇奖机
13 {
14 public partial class Form1 : Form
15 {
16 public Form1()
17 {
18 InitializeComponent();
19 }
20 Thread th;
21 bool b = false;
22 private void button1_Click(object sender, EventArgs e)
23 {
24 if (b == false)
25 {
26 b = true;
27 th = new Thread(PlayGame);
28 th.IsBackground = true;
29 th.Start();
30 button1.Text = "停止";
31 }
32 else
33 {
34 b = false;
35 button1.Text = "开始";
36 }
37 }
38 public void PlayGame()
39 {
40 Random r = new Random();
41 while(b)
42 {
43 Thread.Sleep(10);
44 label1.Text = r.Next(0, 10).ToString();
45 label2.Text = r.Next(0, 10).ToString();
46 label3.Text = r.Next(0, 10).ToString();
47 }
48 }
49
50 private void Form1_Load(object sender, EventArgs e)
51 {
52 Control.CheckForIllegalCrossThreadCalls = false;
53 }
54
55 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
56 {
57 if(th!=null)
58 {
59 th.Abort();
60 }
61 }
62 }
63 }

用线程执行摇奖机

进程

1 using System.Threading.Tasks;

进程命名空间

 1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Linq;
5 using System.Text;
6 using System.Threading.Tasks;
7
8 namespace 进程
9 {
10 class Program
11 {
12 static void Main(string[] args)
13 {
14 // 获取当前程序中所有正在运行的进程
15 //Process[] pros = Process.GetProcesses();
16 //foreach (var item in pros)
17 //{
18 // // 杀死进程
19 // // item.Kill();
20 // Console.WriteLine(item);
21 //}
22
23 // 通过进程打开一些应用程序
24 //Process.Start("calc");
25
26 // 通过一个进程打开指定的文件
27 ProcessStartInfo psi = new ProcessStartInfo(@"C:\Users\sam\Desktop\控件命名规范.PNG");
28 Process p = new Process();
29 p.StartInfo = psi;
30 p.Start();
31 Console.ReadKey();
32 }
33 }
34 }

C# 线程与进程的更多相关文章

  1. Python 【第五章】:线程、进程和协程

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...

  2. Python网络编程之线程,进程

    一. 线程: 基本使用 线程锁 线程池 队列(生产者消费者模型) 二. 进程:  基本使用  进程锁 进程池 进程数据共享 三. 协程: gevent greenlet 四. 缓存: memcache ...

  3. iOS开发:(线程篇-上)线程和进程

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  4. LR中线程和进程的区别

    LoadRunner中的进程与线程    1.进程与线程的区别: 进程和线程的区别是什么?进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性.进程和线程的区别 ...

  5. iOS_线程和进程的区别与联系

    首先是线程和进程的联系: 线程和进程都是由操作系统所负责的程序运行的基本单元,系统利用该基本单元实现对应用的并发性. 接下来就是线程和进程的区别: 线程和进程最大的区别就是它们是操作系统的两种资源管理 ...

  6. python学习笔记12 ----线程、进程

    进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的 ...

  7. python任务执行之线程,进程,与协程

    一.线程 线程为程序中执行任务的最小单元,由Threading模块提供了相关操作,线程适合于IO操作密集的情况下使用 #!/usr/bin/env python # -*- coding:utf-8 ...

  8. 线程 VS 进程

    线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; (2)资源拥有: ...

  9. Python之线程、进程和协程

    python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...

  10. Python 线程、进程和协程

    python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补,为了不浪费时间,所以我们直接学习threading 就可以了. ...

随机推荐

  1. three.js教程8-渲染器WebGLRenderer和前端UI界面

    1.html的UI交互界面与Canvas画布叠加 需求:把threejs Cavnas画布和HTML元素叠加布局,在canvas上添加按钮,通过按钮点击修改canvas场景. // canvas画布绝 ...

  2. Git命令拾掇

    修改commit信息 git commit --amend -m 'The new message' 使用ssh替换https:// 设置某个仓库 git remote set-url origin ...

  3. SQL Server使用for xml path 多行合并成一行,逗号分隔,拆解分析实现原理

    我们写sql脚本处理数据的时候 针对部分数据进行group by 分组,分组后需要将部分数据放入分组后的行里面以逗号分隔. 举一个简单例子: 如上图的数据,需要对学生进行分组,取得学生都参与了哪些学科 ...

  4. 用 C 语言开发一门编程语言 — 基于 Lambda 表达式的函数设计

    目录 文章目录 目录 前文列表 函数 Lambda 表达式 函数设计 函数的存储 实现 Lambda 函数 函数的运行环境 函数调用 可变长的函数参数 源代码 前文列表 <用 C 语言开发一门编 ...

  5. centos7了解

    A,B,C,D四个任务有依赖关系①init:总时间T1+T2+T3+T4+T5+T6+T7②upstart:总时间T1+T2+T3,启动速度加快,但是有依赖关系的服务还是必须先后启动.③systemd ...

  6. 一文搞懂docker容器基础:docker镜像管理,docker容器管理

    目录 一.系统环境 二.docker 2.1 Docker 概述 2.2 Docker 平台 2.3 我可以使用 Docker 做什么? 2.3.1 快速.一致地交付您的应用程序 2.3.2 响应式部 ...

  7. 什么是Token?为什么大模型要计算Token数

    本文分享自华为云社区<[技术分享]什么是Token?为什么GPT基于Token定价>,作者:开天aPaaS小助手Tracy. 在使用LLM大模型时,我们经常会遇到一个关键词,叫:Token ...

  8. Android项目代码规范

    项目代码规范 Android Studio的代码Style检查和inspect Code功能已经很强大,规范只负责代码结构和文件结构 带?的内容为可选或团队内协商内容 核心目标 提高可维护性: MVV ...

  9. .NET周刊【5月第4期 2024-05-26】

    国内文章 开源低代码框架 ReZero API 正式版本发布 ,界面操作直接生成API https://www.cnblogs.com/sunkaixuan/p/18201175 ReZero是一款. ...

  10. ubuntu下openCV-Haar特征分类器训练

    ubuntu下openCV-Haar特征分类器训练 这段时间在学openCV,准备做一个头部检测,但是openCV自带的分类器只有人脸检测的,而且准确度不高,就准备自己训练一个分类器.在网上看了很多的 ...