您的位置:首页 > 编程语言 > C#

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

2017-03-17 09:34 239 查看
首先了解一下相关概念。

进程:正在运行的计算机程序的实例。

线程: 有事被称作轻量级进程,是程序执行流的最小单元

开启一个线程通常有几种方式,接下来一一介绍。

通过委托开启

可以通过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释放之前的锁,同理方法二中也是进行这种操作,由于两者同是等待对方释放要加的锁,所以会一直等待下去,这样就形成了死锁,解决死锁的方法可以通过编程开始阶段设定锁定顺序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 线程