代码改变世界

多线程学习系列:(八)Winform中多线程编程基础上

2011-01-27 11:39 by 微软一点都不软, 269 阅读, 0 推荐, 收藏, 编辑
摘要:首先我们创建一个Winform的应用程序,在上面添加一个多行文本框和一个按钮控件,按钮的事件如下:Thread.Sleep(1000); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) sb.Append("test"); string s = sb.ToString(); textBox1.Text = s; 首先我们可以把这个操作理解为一个非常耗时的操作,它至少占用1秒的时间。在1秒后,我们整了一个大字符串作为文本框的值,然后在标签上显示给文本框赋值这个UI渲染行为需要 阅读全文

多线程学习系列:(七)基于多线程的基本组件

2011-01-27 11:33 by 微软一点都不软, 265 阅读, 1 推荐, 收藏, 编辑
摘要:在多线程应用中我们有一些很常见的需求,比如定时去做计划任务,或者是在执行一个长时间的任务,在执行这个任务的过程中能有进度显示(能想到要实现这个需求需要新开一个线程,避免阻塞UI的更新)。对于这些应用.NET提供了现成的组件。 首先来看一下System.Threading的Timer组件,它提供了定时执行某个任务的方法:ThreadPool.SetMinThreads(2, 2); ThreadPool.SetMaxThreads(4, 4); Timer timer = new Timer((state) => { int a, b; ThreadPool.GetAvailableThr 阅读全文

多线程学习系列:(六)线程池基础下

2011-01-27 11:32 by 微软一点都不软, 162 阅读, 0 推荐, 收藏, 编辑
摘要:这节我们按照线程池的核心思想来自定义一个简单的线程池: 1) 池中使用的线程不少于一定数量,不多于一定数量 2) 池中线程不够的时候创建,富裕的时候收回 3) 任务排队,没有可用线程时,任务等待 我们的目的只是实现这些“需求”,不去考虑性能(比如等待一段时间再去创建新的线程等策略)以及特殊的处理(异常),在实现这个需求的过程中我们也回顾了线程以及线程同步的基本概念。 首先,把任务委托和任务需要的状态数据封装一个对象:public class WorkItem { public WaitCallback Action { get; set; } public object State { get 阅读全文

多线程学习系列:(五)线程池基础上

2011-01-27 11:31 by 微软一点都不软, 189 阅读, 0 推荐, 收藏, 编辑
摘要:池(Pool)是一个很常见的提高性能的方式。比如线程池连接池等,之所以有这些池是因为线程和数据库连接的创建和关闭是一种比较昂贵的行为。对于这种昂贵的资源我们往往会考虑在一个池容器中放置一些资源,在用的时候去拿,在不够的时候添点,在用完就归还,这样就可以避免不断的创建资源和销毁资源。 如果您做过相关实验的话可能会觉得不以为然,似乎开1000个线程也用不了几百毫秒。我们要这么想,对于一个高并发的环境来说,每一秒假设有100个请求,每个请求需要使用(开和关)10个线程,也就是一秒需要处理1000个线程的开和关,每个线程独立堆栈1M,可以想象在这一秒中内存分配和回收是多么夸张,这个开销不能说不昂贵。 阅读全文

多线程学习系列:(四)线程同步基础下

2011-01-27 11:30 by 微软一点都不软, 181 阅读, 0 推荐, 收藏, 编辑
摘要:回顾一下上次,我们讨论了lock/AutoResetEvent/ManualResetEvent以及Semaphore。这些用于线程同步的结构叫做同步基元。同步基元从类型上可以分为锁定/通知/联锁三种。lock显然锁定方式,而且是独占锁定,也就是在锁释放之前不能由其它线程获得。 Semaphore也是一种锁定,只不过不是独占锁,可以指定多少个线程访问代码块。AutoResetEvent和ManualResetEvent当然就是通知方式了,前者在通行之后自动重置,后者需要手动重置。我们还看到了即使使用同步机制不一定能确保线程按照我们规划的去执行,因为从根本上来说,操作系统的线程调度我们是没有办法 阅读全文
上一页 1 2 3 4 5 6 7 ··· 20 下一页