摘要: 背景   站点经过几年的积累,一个页面上需要加载数十个脚本和样式文件(之后我们把脚本和样式统称为静态资源),在浏览器没有缓存的情况下如此之多的请求数不但会对服务器有比较大的压力(这个问题可以通过CDN或反向代理解决),而且页面呈现也会非常慢(我们知道脚本的下载会阻塞其它资源下载以及页面呈现)。由于一个站点往往页面数量很多,而且由于静态资源分布于页面/用户控件以及面板页等各种类型的页面... 阅读全文
posted @ 2010-05-14 16:48 lovecindywang 阅读(6899) 评论(2) 推荐(6) 编辑
摘要: 谈谈最近优化一个网站项目的经验,首先说一下背景情况: 1) 在页面后台代码中我们把页面上大部分的HTML都使用字符串来拼接生成然后直接赋值给LiteralControl。 2) 网站CPU很高,基... 阅读全文
posted @ 2010-03-10 11:22 lovecindywang 阅读(6883) 评论(37) 推荐(12) 编辑
摘要: 线程同步的问题 1) 我们必须找到代码中所有可能被多个线程同时访问的资源,然后使用线程同步来保护资源,并且我们没有办法来验证是不是正确进行了线程同步,包括是否有遗漏和是否对不需要同步的资源进行同步。... 阅读全文
posted @ 2010-03-08 17:30 lovecindywang 阅读(1816) 评论(2) 推荐(0) 编辑
摘要: 最近此书出了第三版,在阅读此书线程部分的过程中有很多心得,补充了此前知识盲点,因此把这些关键和重要的知识点汇集成日志文章并且纳入到这个系列中。顺便说一下,笔者喜欢这本书的原因是作者作为微软顾问并没有按照MSDN的教条教大家怎么去用而是能说出很多自己的观点甚至很多是微软.NET框架不够的地方,并给出自己的实现。为什么说线程是比较昂贵的?1) 从内存上来说,(对于32位架构)每一个线程包含线程内核对象... 阅读全文
posted @ 2010-02-24 17:21 lovecindywang 阅读(4391) 评论(4) 推荐(0) 编辑
摘要: 上次我们说了,要进行多线程编程,我们可以使用最原始的方式也是最灵活的方式进行,那就是Thread(ThreadPool)+信号量+锁+Control.Invoke。.NET的异步编程模型给我们提供了一... 阅读全文
posted @ 2010-01-09 14:18 lovecindywang 阅读(3580) 评论(5) 推荐(4) 编辑
摘要: 谈多线程谈到现在,我们要明确多线程的一个好处是可以进行并行的运算(充分利用多核处理器,对于桌面应用程序来说就更重要一点了,没有WEB服务器,利用多核只能靠自己),还有一个好处就是异步操作,就是我们可以... 阅读全文
posted @ 2010-01-08 22:04 lovecindywang 阅读(4156) 评论(4) 推荐(4) 编辑
摘要: 在之前的文章中我们介绍过两种Timer和BackgroundWorker组件,在上文中我们提到过,强烈建议在UI线程上操作控件,否则很容易产生人品问题。可以想到,上次介绍的两个Timer基于Threa... 阅读全文
posted @ 2010-01-07 14:58 lovecindywang 阅读(3853) 评论(2) 推荐(2) 编辑
摘要: 首先我们创建一个Winform的应用程序,在上面添加一个多行文本框和一个按钮控件,按钮的事件如下: Thread.Sleep(1000);StringBuilder sb = new StringB... 阅读全文
posted @ 2010-01-06 12:04 lovecindywang 阅读(7247) 评论(9) 推荐(6) 编辑
摘要: 浅谈.NET下的多线程和并行计算(一)前言浅谈.NET下的多线程和并行计算(二)线程基本知识浅谈.NET下的多线程和并行计算(三)线程同步基础上浅谈.NET下的多线程和并行计算(四)线程同步基础下浅谈.NET下的多线程和并行计算(五)线程池基础上浅谈.NET下的多线程和并行计算(六)线程池基础下浅谈.NET下的多线程和并行计算(七)基于多线程的基本组件浅谈.NET下的多线程和并行计算(八)Winform中多线程编程基础上浅谈.NET下的多线程和并行计算(九)Winform中多线程编程基础下浅谈.NET下的多线程和并行计算(十).NET异步编程模型基础上浅谈.NET下的多线程和并行计算(十一). 阅读全文
posted @ 2010-01-05 19:29 lovecindywang 阅读(3974) 评论(8) 推荐(6) 编辑
摘要: 在多线程应用中我们有一些很常见的需求,比如定时去做计划任务,或者是在执行一个长时间的任务,在执行这个任务的过程中能有进度显示(能想到要实现这个需求需要新开一个线程,避免阻塞UI的更新)。对于这些应用.NET提供了现成的组件。 首先来看一下System.Threading的Timer组件,它提供了定时执行某个任务的方法: ThreadPool.SetMinThreads(2, 2);Thread... 阅读全文
posted @ 2010-01-05 11:03 lovecindywang 阅读(4109) 评论(3) 推荐(5) 编辑
摘要: 这节我们按照线程池的核心思想来自定义一个简单的线程池: 1) 池中使用的线程不少于一定数量,不多于一定数量 2) 池中线程不够的时候创建,富裕的时候收回 3) 任务排队,没有可用线程时,任务等待... 阅读全文
posted @ 2010-01-04 14:44 lovecindywang 阅读(3649) 评论(1) 推荐(2) 编辑
摘要: 池(Pool)是一个很常见的提高性能的方式。比如线程池连接池等,之所以有这些池是因为线程和数据库连接的创建和关闭是一种比较昂贵的行为。对于这种昂贵的资源我们往往会考虑在一个池容器中放置一些资源,在用的时候去拿,在不够的时候添点,在用完就归还,这样就可以避免不断的创建资源和销毁资源。 如果您做过相关实验的话可能会觉得不以为然,似乎开1000个线程也用不了几百毫秒。我们要这么想,对于一个高并发的环境... 阅读全文
posted @ 2009-12-31 13:20 lovecindywang 阅读(5626) 评论(5) 推荐(2) 编辑
摘要: 回顾一下上次,我们讨论了lock/AutoResetEvent/ManualResetEvent以及Semaphore。这些用于线程同步的结构叫做同步基元。同步基元从类型上可以分为锁定/通知/联锁三种。lock显然锁定方式,而且是独占锁定,也就是在锁释放之前不能由其它线程获得。Semaphore也是一种锁定,只不过不是独占锁,可以指定多少个线程访问代码块。AutoResetEvent和Manual... 阅读全文
posted @ 2009-12-30 17:16 lovecindywang 阅读(4345) 评论(9) 推荐(6) 编辑
摘要: 其实,如果线程都是很独立的,不涉及到任何资源访问的,那么这些毫无干扰的线程不会产生什么问题。但是在实际应用中我们的线程总是涉及到资源访问的,而且往往涉及到共享资源的访问,那么就产生了线程同步的问题。一直觉得线程同步这个名词很奇怪,字面上看同步就是使得步调一致,线程同步是不是就是让线程步调一致的访问资源呢?事实上反了,线程同步恰巧是让线程不同时去访问资源而是去按照我们期望的顺序依次访问资源(是同步资... 阅读全文
posted @ 2009-12-28 15:44 lovecindywang 阅读(4906) 评论(14) 推荐(11) 编辑
摘要: 首先来看看如何创建线程:Console.WriteLine(Process.GetCurrentProcess().Threads.Count);Thread t1 = new Thread(() => { Thread.Sleep(1000); Thread t = Thread.CurrentThread; Console.WriteLine("Name: " + t.Name); Co... 阅读全文
posted @ 2009-12-25 16:15 lovecindywang 阅读(5392) 评论(11) 推荐(8) 编辑
摘要: 作为一个ASP.NET开发人员,在之前的开发经历中接触多线程编程的机会并不是很多,但是随着.NET 4.0的发布临近,我越来越感受到未来的1-2年中并行计算将会有很大的应用。于是决定通过写日志的方式来总结一下.NET 3.5下的多线程编程进而引入.NET 4.0提供的新的并行库以及新的并行编程模式和编程的思维方式。个人觉得在日常的编程中对于ASP.NET程序员来说使用多线程编程不是很多,其实我们无... 阅读全文
posted @ 2009-12-25 12:47 lovecindywang 阅读(6288) 评论(24) 推荐(15) 编辑