[我眼中的C#]多线程编程

首先了解一下相关概念。
进程:正在运行的计算机程序的实例。
线程: 有事被称作轻量级进程,是程序执行流的最小单元
开启一个线程通常有几种方式,接下来一一介绍。
通过委托开启
可以通过Action和Func委托分别开启两个不带和带有返回值的线程
先定义两个方法,Thread.CurrentThread.ManagedThreadId用来返回线程ID
这里写图片描述
Action委托示例如下:
这里写图片描述
这里写图片描述
Func委托(Thread.Sleep()可以让当前线程休眠):
这里写图片描述
这里写图片描述
我们也可以调用BeginInvoke里的回调方法:
这里写图片描述
这里写图片描述
当然可以简写为Lambda表达式
这里写图片描述
通过线程开启和通过线程池开启
前台线程和后台线程最主要的区别在于,当前台线程终止的时候,所有的后台线程都会终止,而后台线程终止后会等待前台线程执行完毕之后才结束进程。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
通过任务开启
这里写图片描述
这里写图片描述
这里写图片描述
线程争用和死锁问题
当两个线程同时调用同一资源时就会因为同时改变或调用它内部的值而发生异常,解决的方法就是给这一资源加一把锁,让同一时间内只能有一个线程对他进行访问,但这又导致了另一个问题的产生—死锁,下面看一下例子
public class SampleThread{
private StateObject s1;
private StateObject s2;
public SampleThread(StateObject s1,StateObject s2){
this.s1= s1;
this.s2 = s2;
}
public void Deadlock1(){
int i =0;
while(true){
lock(s1){
lock(s2){
s1.ChangeState(i);
s2.ChangeState(i);
i++;
Console.WriteLine(“Running i : “+i);
}
}
}
}
public void Deadlock2(){
int i =0;
while(true){
lock(s2){
lock(s1){
s1.ChangeState(i);
s2.ChangeState(i);
i++; Console.WriteLine(“Running i : “+i);
创建对象s1和s2,之后调用两个方法,方法一先对s1加锁,之后对s2加锁,方法二先对s2加锁,之后对s1加锁,当方法一种对s1加锁之后对s2加锁,但由于方法二中已经加锁,所以等待s2释放之前的锁,同理方法二中也是进行这种操作,由于两者同是等待对方释放要加的锁,所以会一直等待下去,这样就形成了死锁,解决死锁的方法可以通过编程开始阶段设定锁定顺序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值