首页 > 编程语言 >C# 多线程

C# 多线程

时间:2023-04-28 15:48:08浏览次数:52  
标签:异步 同步 C# 执行 线程 多线程 CPU

首先要关注电脑配置是否是多核多CPU的。

因为一个CPU在同一时刻只能运行一个线程,但是多个CPU在同一时刻就可以运行多个线程。

 

多线程的优点:

1、可以同时完成多个任务;

2、可以使程序的响应速度更快;

3、可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时间让给别的任务;

4、可以随时停止任务;

5、可以设置每个任务的优先级以优化程序性能。

 

不利方面:

(1)线程也是程序,所以线程需要占用内存,线程越多,占用内存也越多。

(2)多线程需要协调和管理,所以需要占用CPU时间以便跟踪线程。

(3)线程之间对共享资源的访问会相互影响,必须解决争用共享资源的问题。

(4)线程太多会导致控制太复杂,最终可能造成很多程序缺陷。

 

 

当线程之间争夺CPU时间时,CPU按照线程的优先级给予服务。

高优先级的线程可以完全阻止低优先级的线程执行。

.NET为线程设置了Priority属性来定义线程执行的优先级别,里面包含5个选项,其中Normal是默认值。
Highest->AboveNormal->Normal->BelowNormal->Lowest

除非系统有特殊要求,否则不应该随便设置线程的优先级别。

 

 

Thread 中包括了多个方法来控制线程的创建、挂起、停止、销毁。

Abort()     终止本线程。
GetDomain() 返回当前线程正在其中运行的当前域。
GetDomainId() 返回当前线程正在其中运行的当前域Id。
Interrupt() 中断处于 WaitSleepJoin 线程状态的线程。
Join() 已重载。 阻塞调用线程,直到某个线程终止时为止。
Resume() 继续运行已挂起的线程。
Start()   执行本线程。
Suspend() 挂起当前线程,如果当前线程已属于挂起状态则此不起作用
Sleep()   把正在运行的线程挂起一段时间。

 

 

 

线程分为前台线程和后台线程。

前台线程:只有所有的前台线程都结束,应用程序才能结束。默认情况下创建的线程都是前台线程。

后台线程:只要所有的前台线程结束,后台线程自动结束。通过Thread.IsBackground设置后台线程。

必须在调用Start方法之前设置线程的类型,否则一旦线程运行,将无法改变其类型。

 

后台线程一般用于处理不重要的事情,应用程序结束时,后台线程是否执行完成对整个应用程序没有影响。如果要执行的事情很重要,需要将线程设置为前台线程。

 

 

线程需要线程同步。

所谓同步:是指在某一时刻只有一个线程可以访问变量。
如果不能确保对变量的访问是同步的,就会产生错误。
c#为同步访问变量提供了一个非常简单的方式,即使用c#语言的关键字Lock,它可以把一段代码定义为互斥段,互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。

 

在c#中,关键字Lock定义如下:
Lock(expression)
{
   statement_block
}

expression代表你希望跟踪的对象:
           如果你想保护一个类的实例,一般地,你可以使用this;
           如果你想保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了
而statement_block就算互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。

 

 

线程你还需要明白同步和异步。

同步和异步是对方法执行顺序的描述。

同步:等待上一行完成计算之后,才会进入下一行。

例如:请同事吃饭,同事说很忙,然后就等着同事忙完,然后一起去吃饭。

异步:不会等待方法的完成,会直接进入下一行,是非阻塞的。

例如:请同事吃饭,同事说很忙,那同事先忙,自己去吃饭,同事忙完了他自己去吃饭。

 

同步方法和异步方法的区别:

1、同步方法由于主线程忙于计算,所以会卡住界面。

      异步方法由于主线程执行完了,其他计算任务交给子线程去执行,所以不会卡住界面,用户体验性好。

2、同步方法由于只有一个线程在计算,所以执行速度慢。

      异步方法由多个线程并发运算,所以执行速度快,但并不是线性增长的(资源可能不够)。多线程也不是越多越好,只有多个独立的任务同时运行,才能加快速度。

3、同步方法是有序的。

      异步多线程是无序的:启动无序,执行时间不确定,所以结束也是无序的。一定不要通过等待几毫秒的形式来控制线程启动/执行时间/结束。

 

异步多线程的无序操作,也可以通过.NET框架已经帮我们实现的回调来变成有序的。

使用EndInvoke可以获取委托异步调用的返回值

 

 

 本文参考c#多线程 - 君莫笑~~ - 博客园 (cnblogs.com)

写的非常好,也更详细,推荐大家阅读。

标签:异步,同步,C#,执行,线程,多线程,CPU
From: https://www.cnblogs.com/Lee597/p/17362349.html

相关文章

  • CMakeLists---自定义变量-add_definitions()函数
    转载:https://blog.csdn.net/qq_35699473/article/details/115837708引言其实这个函数在安装一些库的时候,它的CMakeLists里面就有这样的函数。典型的就是opencv了。opencv安装时候有一些指令也是针对这个函数的,比如安装命令(随便搜索的):cmake ../opencv-3.4.1-DWITH_GTK_2......
  • echarts饼图实现圆环图例修改
    实现效果:代码:constoption={//环形图中间文字title:{text:'1200',subtext:'总户数',textStyle:{fontSize:16,color:'#333',fontWeight:600,},subtextStyle:{fontSize:12,c......
  • 词库过大导致的Redis超时问题-RedisCommandTimeoutException
    问题Redis缓存超时问题报错内容redisio.lettuce.core.RedisCommandTimeoutException:Commandtimedoutafter10second(s)原因1.报错原因这里是因为词库的数据量过大,在开发库中有40w的数据需要刷到缓存中,因数据量过大时间久,Redis直接刷挂了2.为什么线上没有问题线上的......
  • 简单理解Collections.synchronizedList
    转:简单理解Collections.synchronizedListsynchronizedList中的listIterator和listIterator(intindex)方法并没有做同步处理,遍历的时候需要加锁 编译后的class   ......
  • access 查询报“提供程序无法确定 Object 值.例如,该行刚刚创建,未提供 Object 列的默
    access查询报“提供程序无法确定Object值.例如,该行刚刚创建,未提供Object列的默认值,并且”System.InvalidOperationException:TheprovidercouldnotdeterminetheObjectvalue.Forexample,therowwasjustcreated,thedefaultfortheObjectcolumnwasnota......
  • oracle 数据库事务,提交,回滚,保存点,表的锁定,隐式锁,显示锁,写锁,读锁,排他锁,共享
    [color=red]数据库事务的概念[/color]事务是由相关操作构成的一个完整的操作单元。两次连续成功的COMMIT或ROLLBACK之间的操作,称为一个事务。在一个事务内,数据的修改一起提交或撤销,如果发生故障或系统错误,整个事务也会自动撤销。比如,我们去银行转账,操作......
  • ubuntu core
    /etc/default/apport---->1/etc/sysctl.conf<<kernel.core_pattern=/coredump/core-%e-%p-%t/sbin/sysctl-p查看路径/proc/sys/kernel/core_pattern ......
  • 使用Mockito-mock,static方法
    示例publicList<Authen>selectAuthenList(Authenauthen){//静态方法LoggedInUserloginUser=WebUtil.getLoggedInUser(); StringtenantId=loginUser.getTenantId(); authen.setTenantId(Long.parseLong(tenantId));//业务 returnau......
  • ElasticSearch是什么
    一、ElasticSearch简介ElasticsearchElasticsearch是一个基于ApacheLucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。特点:分布式的实时文件存储,每个字段都被索引并可被搜索分布式的实时分析搜索引......
  • 灾难处理:卸载无法开机(蓝屏)的exchange服务器
    目的:卸载无法开机(蓝屏)的exchange服务器,从AD层面删除图形化界面卸载: 确保exchange03上没有任何的数据库命令行的模式下进行卸载: ......