摘要:在上一讲介绍了使用lock来实现线程之间的同步。实际上,这个lock是C#的一个障眼法,在C#编译器编译lock语句时,将其编译成了调用Monitor类。先看看下面的C#源代码:publicstaticvoidMyLock(){lock(typeof(Program)){}}复制代码 上面的代码通过lock语句使MyLock同步,这个方法被编译成IL后,代码如图1所示。 图1 从上图被标注的区域可以看到,一条lock语句被编译成了调用Monitor的Enter和Exit方法。Monitor在System.Threading命名空间中。lock的功能就相当于直接调用Monitor的Entry方.
阅读全文
12 2011 档案
摘要:虽然线程可以在一定程度上提高程序运行的效率,但也会产生一些副作用。让我们先看看如下的代码:classIncrement{privateintn=0;privateintmax;publicIncrement(intmax){this.max=max;}publicintresult{get{returnn;}set{n=value;}}publicvoidInc(){for(inti=0;i<max;i++){n++;}}}classProgram{publicstaticvoidMain(){Incrementinc=newIncrement(10000);Thread[]thread
阅读全文
摘要:如果设计一个服务器程序,每当处理用户请求时,都开始一个线程,将会在一定程序上消耗服务器的资源。为此,一个最好的解决方法就是在服务器启动之前,事先创建一些线程对象,然后,当处理客户端请求时,就从这些建好的线程中获得线程对象,并处理请求。保存这些线程对象的结构就叫做线程池。 在C#中可以通过System.Threading.ThreadPool类来实现,在默认情况下,ThreadPool最大可建立500个工作线程和1000个I/O线程(根据机器CPU个数和.net framework版本的不同,这些数据可能会有变化)。下面是一个用C#从线程池获得线程的例子:privatestaticvoidex.
阅读全文
摘要:一、 Thread类的基本用法通过System.Threading.Thread类可以开始新的线程,并在线程堆栈中运行静态或实例方法。可以通过Thread类的的构造方法传递一个无参数,并且不返回值(返回void)的委托(ThreadStart),这个委托的定义如下:[ComVisibleAttribute(true)]public delegate void ThreadStart()我们可以通过如下的方法来建立并运行一个线程。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingS
阅读全文
摘要:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }委托实际上是把方法名作为参数,但是若有好多个方法时,就要指明是哪个参数 查看如下代码:this.Invoke(delegate { MessageBox.Show("t4"); });熟悉winform的开发者都知道,this是一个窗体的实例,故不做另外解释。该代码的运行,就会导致异常:{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }。其实,要从错误的提示信息来看,这个匿名方法写的是一点问题都没有的。问题的关键是invoke这个函数的参数,
阅读全文
摘要:GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久。早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是GC的第一次出现。Lisp的程序员认为内存管理太重要了,所以不能由程序员自己来管理。 但后来的日子里Lisp却没有成气候,采用内存手动管理的语言占据了上风,以C为代表。出于同样的理由,不同的人却又不同的看法,C程序员认为内存管理太重要了,所以不能由系统来管理,并且讥笑Lisp程序慢如乌龟的运行速度。的确,在那个对每一个Byte都要精心计算的年代GC的速度和对系统资源的大量占用使很多人的无法接受..
阅读全文
摘要:Linq是近年来微软推出的非常成功的一项技术。比如,当我熟悉Linq之后,再用SQL写商业逻辑时,感觉已经不再适应了。如果您还没有系统的研究过Linq,希望本文可以给您带来帮助。 本文将从以下几个方面介绍Linq在实际开发中的应用范围: 一、LinqToXML 在测试工程内加入xml文件: 用Linq操作XML文件,可以增删改查xml,示例代码如下: 二、LinqToEntity 用EF操作NorthWind 数据库: 注,生成的sql语句分别为:Inner Join : SELECT \r\n1 AS [C1], \r\n[Extent1].[CompanyName] AS [Compan.
阅读全文
摘要:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceEventDemo{delegatevoidTemperatureChangedEventHandle(objectsender,BoiledWaterEventArgsargs);classProgram{staticvoidMain(string[]args){Heaterht=newHeater();Monitormt=newMonitor();ht.TemperatureChanged+=newTemperatur
阅读全文
摘要:4.11 在泛型字典类中使用foreach问题您希望在实现了System. Collections.Generic.IDictionary接口的类型枚举元素,如System.Collections.Generic.Dictionary 或 System.Collections.Generic.SortedList。解决方案最简单的方法是在foreach循环中使用KeyValuePair结构体: // 创建字典对象并填充. Dictionary<int, string> myStringDict = new Dictionary<int, string>(); myStr
阅读全文
摘要:4.10 使用相应的泛型版本替换Hashtable问题您希望通过使用相应的泛型版本替换所有Hashtable来增强应用程序性能并使得代码更为易读。当您发现这些数据结构中存放结构体和值类型会导致装箱/拆箱操作,这就变得非常有必要了。解决方案替换所有已存在的System.Collections.Hashtable类为速度更快的System.Collections.Generic.Dictionary泛型类。这有一个使用System.Collections.Hashtable对象的简单例子:public static void UseNonGenericHashtable() { // 创建并填充一
阅读全文
摘要:4.9 使用泛型创建只读集合问题您希望类中的一个集合里的信息可以被外界访问,但不希望用户改变这个集合。解决方案使用ReadOnlyCollection<T>包装就很容易实现只读的集合类。例子如,Lottery类包含了中奖号码,它可以被访问,但不允许被改变:public class Lottery { // 创建一个列表. List<int> _numbers = null; public Lottery() { // 初始化内部列表 _numbers = new List<int>(5); // 添加值 _numbers.Add(17); _numbers.
阅读全文
摘要:4.8 反转Sorted List里的内容问题您希望在数组和列表类型中可以反转sorted list里的内容同时又维持SortedList和SortedList<T>类原来的功能。无论是SortedList还是泛型SortedList<T>类都直接提供了完成这个功能的方法而又不需要重填列表。解决方案ReversibleSortedList<TKey, TValue>类提供了这些功能,它基于SortedList<TKey, TValue>类,所以拥有相同的功能,它提供了额外的功能是很容易反转已排序的列表。在实例化ReversibleSortedLi
阅读全文
摘要:4.7 创建一个可以被初始化为空的值类型问题您有一个数字类型的变量,用于控制从数据库中获取的数值。数据库可能为这个值返回一个null值。您需要一个简洁的方法来存储这个数值,甚至它返回为null。解决方案使用可空类型。有两个创建可空类型的方法。第一种方法是使用?类型修饰符:int? myDBInt = null;第二种方法是使用Nullable<T>泛型类型:Nullable<int> myDBInt = new Nullable<int>();讨论本质上,下面两个声明是等价的:int? myDBInt = null;Nullable<int> m
阅读全文
摘要:4.6 链表的实现问题您需要链表数据结构,这样就可以很容易地添加和删除元素。解决方案使用泛型LinkedList<T>类。下面的方法创建了一个LinkedList<T>类,并往链表对象中添加节点,然后使用了几种方法从链表节点中获得信息。 public static void UseLinkedList() { // 创建一个LinkedList 对象. LinkedList<TodoItem> todoList = new LinkedList<TodoItem>(); // 创建添加到链表内的TodoItem对象. TodoItem i1 =
阅读全文
浙公网安备 33010602011771号