C# 线程与进程
一、前台线程与后台线程对象
为什么要用多线程?
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# 线程与进程的更多相关文章
- Python 【第五章】:线程、进程和协程
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...
- Python网络编程之线程,进程
一. 线程: 基本使用 线程锁 线程池 队列(生产者消费者模型) 二. 进程: 基本使用 进程锁 进程池 进程数据共享 三. 协程: gevent greenlet 四. 缓存: memcache ...
- iOS开发:(线程篇-上)线程和进程
iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...
- LR中线程和进程的区别
LoadRunner中的进程与线程 1.进程与线程的区别: 进程和线程的区别是什么?进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性.进程和线程的区别 ...
- iOS_线程和进程的区别与联系
首先是线程和进程的联系: 线程和进程都是由操作系统所负责的程序运行的基本单元,系统利用该基本单元实现对应用的并发性. 接下来就是线程和进程的区别: 线程和进程最大的区别就是它们是操作系统的两种资源管理 ...
- python学习笔记12 ----线程、进程
进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的 ...
- python任务执行之线程,进程,与协程
一.线程 线程为程序中执行任务的最小单元,由Threading模块提供了相关操作,线程适合于IO操作密集的情况下使用 #!/usr/bin/env python # -*- coding:utf-8 ...
- 线程 VS 进程
线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; (2)资源拥有: ...
- Python之线程、进程和协程
python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...
- Python 线程、进程和协程
python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补,为了不浪费时间,所以我们直接学习threading 就可以了. ...
随机推荐
- pageoffice在线打开word文件加盖电子印章
一.加盖印章的 js 方法 js方法 二.常见使用场景 1.常规盖章.弹出用户名.密码输入框,选择对应印章. 点击盖章按钮弹出用户名密码登录框,登录以后显示选择电子印章. document.getEl ...
- AIRIOT大学计划暑期训练营圆满结束,产教融合培养物联网产业人才
为促进物联网产业的纵深发展和创新,推进教育链.产业链与创新链的有机衔接,提高学生理论.实践和创新能力,7月3日-7月28日,由航天科技控股集团股份有限公司(简称"航天科技")开 ...
- 5款超好用的AI换脸软件,一键视频直播换脸(附下载链接)
随着AIGC的火爆,AI换脸技术也被广泛应用于娱乐.广告.电影制作等领域,本期文章系统介绍了市面上超火的5款AI软件 换脸整合包收录了全部5款AI工具,请按照需要选择下载: 百度网盘:https:// ...
- Android OpenMAX(三)高通OMX组件实现基础
上一节了解了OMX组件实现的基础内容,这一节我们以高通OMX实现为例,简单看看如何实现一个OMX组件.本节代码参考自: omx_core_cmp.cpp qc_omx_component.h omx_ ...
- WPF使用WPFMediaKit/AForge调用摄像头示例 .net core 8.0 也支持
调用摄像头使我们经常会用到的一个功能,可以根据摄像头捕捉到的图像进行分析处理来做很多的东西,比如电子档案.图像识别.AI分析等等. 本示例中主要介绍Nuget最常用的两个调用摄像头的轮子 WPFMed ...
- 行列式求值,从 $n!$ 优化到 $n^3$
前置知识 \(\sum\) 为累加符号,\(\prod\) 为累乘符号. 上三角矩阵指只有对角线及其右上方有数值其余都是 \(0\) 的矩阵. 如果一个矩阵的对角线全部为 \(1\) 那么这个矩阵为单 ...
- mobile select 移动端下拉框
官方链接 原生 js 移动端选择控件,不依赖任何库 可传入普通数组或者 json 数组 可根据传入的参数长度,自动渲染出对应的列数,支持单项到多项选择 自动识别是否级联 选择成功后,提供自定义回调函数 ...
- linux的账号和组
1.0 账号与用户组 1.1 用户标识符:UID,GID 虽然我们登陆Linux主机的时候输入的是账号,但其实Linux主机并不会直接认识你的账号名称,账号只是为了方便人. 一个文件如何判断他的拥有者 ...
- python安装OCR识别库
(1)安装过程 参考的这个博客:https://blog.csdn.net/lanxianghua/article/details/100516187?depth_1-utm_source=distr ...
- Idea克隆检出git项目
1.我这里假设你已经安装好了Idea和Git环境 2. .