欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > C#进阶(多线程相关)

C#进阶(多线程相关)

2025/3/19 22:51:55 来源:https://blog.csdn.net/weixin_61819056/article/details/146349963  浏览:    关键词:C#进阶(多线程相关)

1。进程?

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,【是系统进行资源分配的基本单位】,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,【进程是线程的容器】。程序是指令、数据及其组织形式的描述,进程是程序的实体。

概括:

进程是程序运行的环境。进程是线程的容器。一个进程可以包含多个线程。
进程是系统进行资源分配的基本单位,而线程是系统进行资源分配的最小单位(线程不能再分)。

A。Thread多线程对象:

实例化Thread t1 = new Thread(两种委托),没有参数委托;带传递参数委托

多线程管理(被开发者诟病)
启动:t1.Start(向线程传递的数据)
中止:t1.Abort()
挂起:t1.Suspend()
重启:t1.Resume()

多线程的状态: UnStarted未启动, Running运行中, Suspended已挂起, Aborted已中止, Stoped已停止, …

多线程等待: t1.Join(毫秒数), Thread.Sleep(毫秒数)

B。Thread重要属性:

IsAlive 线程状态是否是存活。true存活
IsBackground 是否是后台线程。true后台
ThreadState 线程状态,比IsAlive范围大。
CurrentThread 当前执行的线程。
Name 线程名称
Priority 线程优先级

C。Thread重要方法:

new Thread(两种委托) 构造函数 ThreadStart和ParameterizedThreadStart
t.Start()启动
t.Abord()中止
t.Suspend()挂起
t.Resume()重新开始
t.Join(毫秒数)线程终止前,阻止调用线程
Thread.Sleep(毫秒数)线程休眠,延迟

Thread线程类缺点是不好用(不好控制),如果创建多个线程时,更不好管理。ThreadPool比Thread好一些,但也好不到那去。
线程锁:相对复杂

下载技术:HttpWebRequest(旧) WebRequest(旧), HttpClient(新),WebClient(新)。

窗体设计
在这里插入图片描述


Thread thread1 = null;
//启动
private void button3_Click(object sender, EventArgs e)
{thread1 = new Thread(() =>{long n = Fibonacci(40);Console.WriteLine(n);Console.WriteLine("一个线程");Invoke(new Action(() => label1.Text = n.ToString()));});            Console.WriteLine("启动");Console.WriteLine(thread1.ThreadState);thread1.Start();Console.WriteLine(thread1.ThreadState);
}
//暂停
private void button6_Click(object sender, EventArgs e)
{Console.WriteLine("暂停");Console.WriteLine(thread1.ThreadState);thread1?.Suspend();Console.WriteLine(thread1.ThreadState);
}
//重启
private void button5_Click(object sender, EventArgs e)
{Console.WriteLine("重启");Console.WriteLine(thread1.ThreadState);thread1?.Resume();Console.WriteLine(thread1.ThreadState);}
//停止
private void button4_Click(object sender, EventArgs e)
{Console.WriteLine("停止");thread1.Abort();
}
//裴波那契数列
public static long Fibonacci(int n)
{if (n < 0)throw new ArgumentOutOfRangeException(nameof(n), "参数必须为非负整数");// 基准情况if (n == 0) return 0;if (n == 1) return 1;// 纯递归调用return Fibonacci(n - 1) + Fibonacci(n - 2);
}  

依次点击输出结果
在这里插入图片描述

2。线程?

线程(英语:Thread)是操作系统能够进行 【运算调度的最小单位】 。它被包含在进程之中,是进程中的实际运作单位。【一条线程指的是进程中一个单一顺序的控制流】,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

概括:

线程是操作系统资源调度的最小单位。线程不能独立运行,必须包含在进程中。进程中可以包含多个线程。多线程执行时是并行(异步),无序的。

串行===>排队===>阻塞(同步) 并行===>无序===>非阻塞(异步)

线程之间要通讯。会有两种方案:同步和异步。

单个线程中能不能异步?可以

【多线程肯定是异步。异步不一定是多线程。】

多线程中有N个线程,但主线程只有一个,其他的线程都称为分线程。对于单线程程序来说,程序中只有一个线程,这个线程就是主线程。

3。多线程概念?优点及缺点?

多线程是指程序中包含多个执行流(线程),即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

概括:

多线程让程序同时运行多个线程,多个线程并行执行(执行时无顺序)

优点:

可以提高CPU的利用率。大大提高了程序的运行效率,用户体现好,粘性高。

缺点:

a.线程也是程序,所以线程运行需要占用计算机资源,线程越多占用资源也越多。(占内存多)
b.多线程需要协调和管理,所以需要CPU跟踪线程,消耗CPU资源。(占cpu多)
c.线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题。(多线程存在资源共享问题 锁)
d.线程太多会导致控制太复杂,最终可能造成很多Bug。(管理麻烦,容易产生bug)

死锁:某个资源不能空闲。

4。线程池?

.NET Framework2.0时代,出现了一个线程池ThreadPool,是一种池化思想,如果需要使用线程,就可以直接到线程池中去获取直接使用,如果使用完毕,在自动的回放到线程池去;

C#锁推荐

窗体设计
在这里插入图片描述
关键代码

 private void btnOn_Click(object sender, EventArgs e){//workerThreads,最大线程数。completionPortThreads,活动线程数。ThreadPool.GetAvailableThreads(out int workerThreads, out int completionPortThreads);Console.WriteLine(workerThreads);Console.WriteLine(completionPortThreads);Console.WriteLine("_____________________");ThreadPool.GetMaxThreads(out int workerThreads1, out int completionPortThreads1);Console.WriteLine(workerThreads1);Console.WriteLine(completionPortThreads1);Console.WriteLine("_____________________");ThreadPool.GetMinThreads(out int workerThreads2, out int completionPortThreads2);Console.WriteLine(workerThreads2);Console.WriteLine(completionPortThreads2);Console.WriteLine("_____________________");//ThreadPool线程池,主要把比较耗时的任务放到一个队列中。开发者不用手动管理线程池中的线程。线程池会帮我们自动管理。ThreadPool.QueueUserWorkItem((state) => { Console.WriteLine(state); }, "abc1");ThreadPool.QueueUserWorkItem((state) => { Console.WriteLine(state); }, "abc2");ThreadPool.QueueUserWorkItem((state) => { Console.WriteLine(state); }, "abc3");}

1点击结果
在这里插入图片描述

 private void btnWait_Click(object sender, EventArgs e){//建议使用:Monitor(语法糖lock关键字),Mutex(互斥锁),Event,Semaphore代替Suspend和ResumeManualResetEvent resetEvent = new ManualResetEvent(false);ThreadPool.QueueUserWorkItem(o =>{//锁资源 lock(资源){},当线程用完资源后,释放资源,资源才能被其他线程使用。//只有一个分线程时,不建议去锁资源。lock (o){//分线程的代码是有序的,线程和其他线程的执行是无序的,想有序借助优先级。this.DoSomething(o.ToString());resetEvent.Set();//在分线程中通过ManualResetEvent类的Set方法,可以向主线程发送信号}}, "执行分线程");resetEvent.WaitOne();//阻塞当前线程,等待分线程的Set()执行,才会继续执行Console.WriteLine("主线程执行完毕");}

2点击结果
在这里插入图片描述

 private void button1_Click(object sender, EventArgs e){ManualResetEvent resetEvent = new ManualResetEvent(false);ThreadPool.QueueUserWorkItem(data =>{int num = (int)data;long result = Fibonacci(num);Invoke(new Action(() =>{Console.WriteLine(result);label1.Text = result.ToString();}));resetEvent.Set();}, 40);}

3点击结果
在这里插入图片描述

  private void DoSomething(string v){Thread.Sleep(10000);Console.WriteLine(v);}public static long Fibonacci(int n){if (n < 0)throw new ArgumentOutOfRangeException(nameof(n), "参数必须为非负整数");// 基准情况if (n == 0) return 0;if (n == 1) return 1;// 纯递归调用return Fibonacci(n - 1) + Fibonacci(n - 2);}

概括:

.net 2.0出现线程池,线程池中可以存在多个线程,让线程池来自动管理(垃圾回收器GC和公共语言运行时CLR)。

好处:解决了部分Thread管理不便的问题,移除了无用的Thread API。提高线程运行性能。

重要API:QueueUserWorkItem(Callback,data)

5。Task任务?

Task在.net 4.0时出现,是在线程池基础上封装而来的,提供了对线程的延续,取消,等待,超时等方面功能。

6。取消任务?

CancellationTokenSource类,CancellationToken结构
CancellationTokenSource cts = new CancellationTokenSource();
cts.Cancel()、cts.IsCancellationRequested属性、cts.Token属性

7。延迟,等待?

Task.Delay(100).Wait(); // 延迟并等待,注意延迟执行也是异步的。
t.Wait() //等待,会阻塞主线程
Task.WaitAny()等待任务数组中任意一个任务完成。result任务数组中第一个完成的任务索引。
Task.WaitAll()等待所有的任务完成,没有返回值
Task.WhenAny()当任务数组中任意一个任务完成的时候,去做其他事情 。返回值Task
Task.WhenAll()当任务数组中所有任务都完成的时候,才去做其他事情 。返回值Task

8。拿分线程结果?分线程向主线程传值?

t.Result属性 配合 Task

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词