多线程异步编程示例和实践-Thread和ThreadPool
说到多线程异步编程,总会说起Thread、ThreadPool、Task、TPL这一系列的技术。总结整理了一版编程示例和实践,分享给大家。 先从Thread和ThreadPool说起: 1. 创建并启动线程 2. 暂停线程 当前线程在执行Thread.Sleep方法时,会等待指定的时间(1000ms) 3. 线程合并 Thread.Join操作会阻塞当前线程,等待子线程完成后再进行运行。 当程序运行时,启动了一个耗时较长的线程打印数字,每次打印输出前需要等待1000ms,我们在主程序中调用ThreadJoin方法,内部调用了thread.Join,该方法允许程序等待thread执行完成。 当thread线程执行完成后,主线程会继续执行,输出Thread Completed! 4. 线程终止 当主程序和单独的数字打印线程运行时,主程序等待6000ms后对thread线程调用了Abort方法。这给线程触发ThreadAbortException异常,导致线程被终止! 这个操作非常危险,因为该操作可以在任何时间发生并可能彻底摧毁应用程序。(Windows服务,因为线程(前台线程)异常退出) 5.线程传递参数 6. 线程安全和Lock 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。线程安全情况下,不会出现数据不一致或者数据污染的问题。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据! 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。 lock 关键字通过获取指定对象的互斥锁,将语句块标记为临界区,执行语句然后释放该锁。 lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。使用Lock,会导致整个应用程序串行化,降低程序的并发能力,影响性能。 到底什么场景下要使用lock保证线程安全:该串行就串行,该并行就并行。 7. 线程的异常捕获和处理 在线程中执行异常处理。线程(甚至是后台线程)中的未处理异常 8. 线程池ThreadPool 核心类:System.Threading.ThreadPool, 线程池受.Net CLR管理的,每一个CLR都有一个线程池实例。 ? 9. 不适合使用线程池的场景 在以下几种情况下,适合于创建并管理自己的线程而不是使用线程池线程: ? 周国庆 2017/6/8 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 从ASP .Net应用程序上传大文件
- ASP.Net Identity 2.0:用户是System.Web.Security.RolePri
- asp.net – HttpContext.Current.Request.IsAuthenticated和
- asp.net – 线程安全和MEF目录
- asp.net-mvc – POST数据中不包含MVC 3远程验证表单按钮
- 从转发器asp.net c中的文本框中获取值
- 在何处以及如何“缓存”ASP.NET角色数据
- asp.net-mvc – 具有列表和编辑器模板的ViewModel
- asp.net – SignalR Autofac OWIN:为什么GlobalHost.Conne
- 缓存asp.net c#的数据列表
- 将ASP.NET应用程序本地化为普通话
- asp.net-mvc – 有没有人能够或者至少试图将液体
- asp.net – 在回发后阻止Bootstrap折叠切换
- asp.net – 你对Windows Workflow Foundation有什
- asp.net-mvc – 为什么POST会在MVC 4中引发异常?
- asp.net-mvc – asp.net mvc区域的默认页面
- asp.net-mvc – 绑定到MVC中的SelectList
- asp.net – 如何在Button Click事件上调用此Jque
- iis-7 – 使用ASP.NET MVC3,如何在区分大小写的路
- asp.net-mvc – 无法在mvc 4中映射特定控制器的路