C#中的线程 &&多线程

在C# 编译的代码,支持多线程并行的执行代码,线程有独立的执行路径,可以与其他的线程同时执行。在c#开发的桌面端程序中(如Console命令行,WPF,Windows Forms等)一开始都是一个单线程,也可以称为“主线程”,这是由运行时(CLR)和操作系统自动创建的一个线程,并且也可以再在这基础上再创建其他的线程。

再浅谈一下线程的使用与误用,下面是通常使用到的应用场景

  1. 一个线程被阻塞的时候,是不会占用CPU资源的
  2. 维持用户的UI界面的响应
  3. 使用工作线程并运行时间消耗打的任务时,主UI线程仍然可以响应键盘,鼠标的事件
  4. 如何做到有效的利用CPU资源呢?在处于一个多线程在一个线程等待其他计算机或者硬件设备响应时十分奏效,当一个线程被阻塞的时候,其他线程就可以利用这个空闲出来的CPU核心继续去完成其他的任务,而不至于整机瘫痪,在很久之前的windows操作系统,就时单线程的,一旦主线程被占用卡死,就需要重新启动才能响应过来;

下面是一个简单的关于多线程的一个例子:

用一个命令行控制台应用程序来演示一遍效果

要操作线程,必须要引用:using System.Threading.Tasks;

  1. 首先定义了一个静态的WriteY()方法,这个方法主要是用for循环,循环在控制台输出打印出 字母“Y”
  2. 接着就是体现多线程输出了,在static void Main()方法在输出字母 “X”的同时,也同时多开一条线程去调用 WriteY()方法做到输出字母 “X” 的同时也输出 字母 “Y”

最后我们在输出他,停留在屏幕上;Console.ReadKey();从效果上看,输出字母 “X”的同时也穿插着字母 “Y”,这就是利用多线程进行同时执行的一个效果;

常用了几个属性: Star,Join,Sleep

Star:开始执行线程

JoIn:Join()方法等待另外一个线程结束之后才继续执行之后的逻辑;

TestDemo:

定义一个静态的方法Good,循环打印字母“N”主要是为了之后凸显等待这个方法的效果

static void Good()

{

for (int i = 0; i < 1000; i++) Console.Write("N");

}

然后我们在控制台静态方法Main()中输出它

从代码可以看出来,在新new多开了一个线程去执行Good()这个方法(t.Start());然后调用了t.Join()线程等待的方法;接着控制台输出了; Thread End!,我们看看输出的效果。

效果:

从效果上可以看出,Thread End! 这句话并没有穿插在字母“N”的中间,而是出现在结束输出字母“N”之后;所以由此看出了,Join()方法等待的作用;

当调用Join时可以使用一个超时参数,一毫秒或者时TimeSpan形式,如果线程正常结束则返回True,如果超时则返回False;

Sleep()方法:当使用Sleep()或者 Join()去等待时,前面也提到过这个内容,线程这个时候属于阻塞(Blocked)的状态,因此不会去消耗CPU资源,当Sleep(0)为0的时,这个时候会立即释放掉当前的时间片,让出CPU资源给其他线程使用,在.Net FrameWork 4.0之后与Thread.Yield()方法的使用方法基本一致;写法如下:阻塞一小时 && 阻塞500毫秒

总结:

谈谈线程与进程,好比如多个进程并行再计算机上执行,多个线程是再一个进程中并行执行。进程是完全隔离的,但线程只是一定程度上隔离,好比如一个线程能获取到后台的数据,而另一个线程能显示出来已经获取到的数据;

我们经常谈论一个CPU的好坏,由多少多少Hz呀,几核几线程等,理论上是越高越好,所以你看到的强大的服务器的CPU基本都是N核N线程,但是普通家用的计算机CPU其实大部分都是性能溢出,大部分的核心都处于睡眠的状态;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值