随笔 - 136  文章 - 0  评论 - 36  阅读 - 17万 

随笔分类 -  C#多线程编程

C#多线程编程之:BackgroundWorker
摘要:可能您会觉得使用委托的BeginInvoke方法实现异步操作太过繁琐了,我们在多数情况下仅仅是希望启动一个线程进行一些工作,完成后执行一个回调函数就OK了,并没有太多其他的需求。有没有更方便的方法实现异步操作呢?就像事件那样简单,注册一个异步操作函数,待函数执行完毕后再自动执行一个回调函数,而异步线程启动、运行、结束之类的操作都由程序自动完成。答案是有的,这就是System.ComponentModel.BackgroundWorker类的功能。 我们先看代码:using System;using System.Collections.Generic;using System.Text;us. 阅读全文
posted @ 2011-04-06 14:50 辛勤的代码工 阅读(2332) 评论(0) 推荐(2) 编辑
C#多线程编程之:异步事件调用
摘要:当一个事件被触发时,订阅该事件的方法将在触发该事件的线程中执行。也就是说,订阅该事件的方法在触发事件的线程中同步执行。由此,存在一个问题:如果订阅事件的方法执行时间很长,触发事件的线程被阻塞,长时间等待方法执行完毕。这样,不仅影响后续订阅事件方法的执行,也影响主线程及时响应用户的其他请求。如何处理这个问题呢?讲到此,我想您已经想到了,那就是异步事件调用。 怎样实现异步事件调用呢?如果您对事件比较了解的话,您应该知道事件的本质其实是一种MulticastDelegate(多播委托)。MulticastDelegate类提供了一个GetInvocationList方法,该方法返回此多播委托的委托. 阅读全文
posted @ 2011-04-04 16:46 辛勤的代码工 阅读(8630) 评论(0) 推荐(1) 编辑
C#多线程编程之:异步方法调用
摘要:异步方法 当一个线程调用方法后,直到方法执行完毕,线程才继续执行,这种方法被称为同步方法。然而,有些方法执行时间可能非常长,比如串口操作或访问网络,这样线程被阻塞,而无法响应用户的其他请求。这种情况通常是无法忍受的,所以这时我们应该使用异步方法。 异步方法的原理是,在方法调用前为异步方法指定一个回调函数,方法调用后被线程池中的一个线程接管,执行该方法。主线程立即返回,继续执行其他工作或响应用户请求。如果异步方法执行完毕,回调函数被自动执行,以处理异步方法的调用结果。 如何实现异步方法呢?C#通过异步委托调用BeginInvoke和EndInvoke方法来实现异步方法。BeginInvoke方法 阅读全文
posted @ 2011-04-04 11:17 辛勤的代码工 阅读(6037) 评论(0) 推荐(2) 编辑
C#多线程编程之:使用ReaderWriterLock类实现多用户读/单用户写同步
摘要:使用Monitor或Mutex进行同步控制的问题:由于独占访问模型不允许任何形式的并发访问,这样的效率总是不太高。许多时候,应用程序在访问资源时是进行读操作,写操作相对较少。为解决这一问题,C#提供了System.Threading.ReaderWriterLock类以适应多用户读/单用户写的场景。该类可实现以下功能:如果资源未被写操作锁定,那么任何线程都可对该资源进行读操作锁定,并且对读操作锁数量没有限制,即多个线程可同时对该资源进行读操作锁定,以读取数据。如果资源未被添加任何读或写操作锁,那么一个且仅有一个线程可对该资源添加写操作锁定,以写入数据。简单的讲就是:读操作锁是共享锁,允许多个. 阅读全文
posted @ 2011-04-04 09:44 辛勤的代码工 阅读(2350) 评论(1) 推荐(1) 编辑
C#多线程编程之:使用Semaphore类限制资源并发访问数
摘要:考虑这样的一个场景:一个停车场的只含一定数量的停车位,只有当停车场中还有空位时,停车场的入口才会打开。C#提供了Semaphore类来处理这种场景。Semaphore类可以在构造时指定资源数量,使用WaitOne方法等待一个资源,使用Release方法释放一个资源。示例代码:using System;using System.Threading;namespace ProcessTest{ class Program { static Semaphore semaphore; static void Main(string[] args) { //创建一个限制资源类 //资源数为5,开放资源. 阅读全文
posted @ 2011-04-03 23:39 辛勤的代码工 阅读(1829) 评论(0) 推荐(0) 编辑
C#多线程编程之:Interlocked类操作
摘要:System.Threading.Interlocked类为多个线程共享的变量提供原子操作。为整型类提供原子类操作 经验显示,那些需要在多线程情况下被保护的资源通常是整型值,且这些整型值在多线程下最常见的操作就是递增、递减或相加操作。Interlocked类提供了一个专门的机制用于完成这些特定的操作。这个类提供了Increment、Decrement、Add静态方法用于对int或long型变量的递增、递减或相加操作。 示例代码:using System;using System.Threading;namespace ProcessTest{ class Program { static i. 阅读全文
posted @ 2011-04-03 22:49 辛勤的代码工 阅读(4070) 评论(2) 推荐(1) 编辑
C#多线程编程之:volatile关键字的原理探讨
摘要:volatile关键字 volatile关键字仅应用于类或结构字段,用于通知编译器,将有多个线程访问该字段,因此它不应当对此成员的状态做任何优化,这样可以确保该字段在任何时间呈现的都是最新的值。 不是所有的类型都可以被定义为volatile字段,只有以下类型才可被定义为volatile:引用类型。指针类型(在不安全的上下文中)。整型,如 sbyte、byte、short、ushort、int、uint、char、float 和 bool。具有整数基类型的枚举类型。已知为引用类型的泛型类型参数。IntPtr 和 UIntPtr。 注意观察一下,就能发现只有值或引用的位数不超过本机整型值的位数(在 阅读全文
posted @ 2011-04-03 20:31 辛勤的代码工 阅读(1587) 评论(0) 推荐(1) 编辑
C#多线程编程之:Timer(定时器)使用示例
摘要:Timer类:设置一个定时器,定时执行用户指定的函数。定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数。构造函数:Timer(TimerCallback callback, object state, int dueTime, int period)参数说明 callback:一个 System.Threading.TimerCallback 委托,表示要执行的方法。 state:一个包含回调方法要使用的信息的对象,或者为 null。 dueTime:调用 callback 之前延迟的时间量(以毫秒为单位)。指定 System.Threading.Timeout.Infinite 阅读全文
posted @ 2011-03-25 10:43 辛勤的代码工 阅读(7368) 评论(0) 推荐(0) 编辑
C#多线程编程之:同步事件和等待句柄
摘要:同步事件和等待句柄用于解决复杂的同步情况。比如一个大的计算步骤包含3个步骤result = first term + second term + third term,如果现在想写个多线程程序,同时计算first term,second term 和third term,等所有3个步骤计算好后再把它们汇总起来,我们就需要使用到同步事件和等待句柄。 同步事件分有两个,分别为AutoResetEvent和ManualResetEvent,这两个类可以用来代表某个线程的运行状态:终止和非终止。 等待句柄用来判断ResetEvent的状态,如果是非终止状态就一直等待,否则放行,让等待句柄下面的代码继. 阅读全文
posted @ 2011-03-25 10:41 辛勤的代码工 阅读(1508) 评论(1) 推荐(0) 编辑
C#多线程编程之:Monitor使用示例及Mutex简介
摘要:Monitor类功效和lock类似: 1 System.Object obj = (System.Object)x; 2 System.Threading.Monitor.Enter(obj); 3 try 4 { 5 DoSomething(); 6 } 7 finally 8 { 9 System.Threading.Monitor.Exit(obj);10 } lock关键字比Monitor简洁,其实lock就是对Monitor的Enter和Exit的一个封装。 另外,Monitor还有几个常用的方法: (1) TryEnter TryEnter能够有效的决绝长期死等的问题,如果在一个并 阅读全文
posted @ 2011-03-25 10:39 辛勤的代码工 阅读(1508) 评论(0) 推荐(0) 编辑
C#多线程编程之:集合类中Synchronized方法与SyncRoot属性原理分析(转)
摘要:我们知道,在.net的一些集合类型中,譬如Hashtable和ArrayList,都有Synchronized静态方法和SyncRoot属性,他们之间有联系吗?我怎么才能用好他们呢? 以Hashtable为例,看看他们的基本用法:1 Hashtable ht = Hashtable.Synchronized(new Hashtable());2 lock (ht.SyncRoot)3 {4 ......5 } Synchronized表示返回一个线程安全的Hashtable,什么样的 hashtable才是一个线程安全的呢?下边我们就从.NET的源码开始理解。1 public static . 阅读全文
posted @ 2011-03-25 10:27 辛勤的代码工 阅读(9414) 评论(2) 推荐(0) 编辑
C#多线程编程之:lock使用注意事项
摘要:1.避免锁定public类型对象。 如果实例可以被公共访问,将出现lock(this)问题。 如有一个类MyClass,该类有一个Method方法通过lock(this)来实现互斥: 1 public class MyClass 2 { 3 public void Method() 4 { 5 lock(this) 6 { 7 ...... 8 } 9 }10 } 如果一个MyClass的实例在不同线程中执行Method方法,可以实现互斥。但如果多个MyClass的实例分别在不同的线程中执行Method方法,互斥将失效,因为此处的lock(this)仅对当前的实例对象进行了加锁。2.禁止锁定类 阅读全文
posted @ 2011-03-25 10:25 辛勤的代码工 阅读(2475) 评论(5) 推荐(4) 编辑

点击右上角即可分享
微信分享提示