当前位置:
首页 > Python基础教程 >
-
C#教程之C# 多线程学习笔记 - 1
基础知识
- 静态字段是在所有线程当中共享状态的。
- 一个线程被阻塞时,不会消耗 CPU 资源。
- Join 可以等待另一个线程结束,Sleep 可以将线程阻塞指定的时间,两者使用时线程都是阻塞状态。
- Join 可以设置超时时间,当线程执行超过指定时间返回 False。
-
Thread.Sleep(0)
会释放当前时间片,将 CPU 资源让出给其他线程。 -
Thread.Sleep(0)
作用与Thread.Yield()
作用一样,后者只会让出给当前核心的其他线程。 -
Thread.Yield()
执行时会影响到程序的话,基本可以确定代码存在 Bug。 - 在使用 Lambda 表达式启动线程并传入变量的时候,不要在启动线程之后更改被捕获变量的值。
- 线程分为前台线程与后台线程,当所有前台线程中止时,程序自动退出。
- 可以显式地提高线程优先级,但可能会导致线程饥饿。
线程池
-
由于线程创建成本高昂(私有局部变量栈,每个线程默认占用 1 MB内存),所以一般都会使用线程池来进行线程的创建与回收。
-
线程池线程可以临时更改其优先级,在回收后会恢复默认状态。
-
开发人员可以通过
Thread.CurrentThread.IsThreadPoolThread
属性查询线程是否运行在线程池中。 -
通过查询 Task.Result 会导致当前线程阻塞,直到任务执行完成,如果发生错误,则会将异常包装到
AggregateException
异常内进行抛出。 -
通过异步委托可以快速创建一个工作线程。
- 创建目标方法委托。
-
在委托上调用
BeginInvoke()
方法,保存其IActionResult
返回值。 -
需要返回结果时,调用
EndInvoke()
方法,传递保存的IActionResult
对象。
class Program { static void Main(string[] args) { Func<string, int> work = Work; var result = work.("测试",null,null); Console.WriteLine("获得结果"); work.EndInvoke(result); } public static int Work(string inputStr) { Console.Write(Thread.CurrentThread); return inputStr.Length; } }
注意:
上述代码在 .NET Core 平台上是无法运行的。
-
异步委托在调用
BeginInvoke()
的时候可以传入回调方法。 -
线程池可以通过
ThreadPool.SetMaxThreads
与ThreadPool.SetMinThreads
进行优化。
作者:MyZony
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式