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

为什么要用多线程?

  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. mac本地搭建ollama

    mac本地搭建ollama webUI *简介:ollama-webUI是一个开源项目,简化了安装部署过程,并能直接管理各种大型语言模型(LLM).本文将介绍如何在你的macOS上安装Ollama服务 ...

  2. Web3连接以太网

    1. Infura Infura 是一种托管服务,提供对各种区块链网络的安全可靠访问,消除了管理区块链基础设施的复杂性,使开发者能够专注于构建创新的 Web3 应用程序. Infura 作为连接应用程 ...

  3. Aliplayer通过HLS流式播放Aliyun Mps(媒体处理)转码的加密视频

    前言 公司需求,上传的视频需要加上公司Logo,同时播放需要采用流式播放禁止下载. 现有的环境在阿里云上,所以自然想到了阿里云的产品[媒体处理]的转码功能. 转码配置 配置比较简单,采用阿里云HLS标 ...

  4. VSCode:让VSCode终端面板显示到右边

    很简单,右击下方终端面板,选中"将视图移动到侧面板": 可以看到终端成功显示到右边了:

  5. 【漏洞复现】蓝凌OA sysUiComponent 任意文件上传漏洞

    阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站.服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作.利用此文所提供的信息而造成的直接 ...

  6. mvc5接口报错:The JSON request was too large to be deserialized的一种原因

    是mvc5版本的接口,接口使用了dynamic接收数组,json对象数组只有56个,length长度不到10万,但是提交就报The JSON request was too large to be d ...

  7. IceRPC之多路复用传输>快乐的RPC

    作者引言 很高兴啊,我们来到了IceRPC之多路复用传输>快乐的RPC,基础引导,打好基础,才能让自已不在迷茫,快乐的畅游世界. icerpc 和多路复用传输 了解 icerpc 协议和多路复用 ...

  8. nginx学习记录【一】在windows上的安装nginx的教程

    1.下载地址 http://nginx.org/en/download.html 2.选择windows版本 如下图: 3.解压并运行 解压到指定目录,如下图 打开cmd,然后cd到那个目录,如下图: ...

  9. 宝塔面板6.X在Docker中安装宝塔面板5.9.1 – 我是不是太闲了?

    我是不是太闲了,问你们三遍,场景是这样的,我在一台VPS里面安装宝塔面板6.X,宝塔面板的软件商店有Docker管理器2.0这一个免费好用的小玩意.大鸟安装好Docker管理器2.0,然后在Docke ...

  10. C++笔记(5)浅拷贝和深拷贝

    1. 定义 浅拷贝(shallow copy):多个对象共用同一块资源,同一块资源释放多次,崩溃或者内存泄漏 深拷贝(deep copy):每个对象共同拥有自己的资源,必须显式提供拷贝构造函数和赋值运 ...