代码改变世界

C#线程优先级详解

2011-03-07 17:14 by 田志良, 19240 阅读, 7 推荐, 收藏, 编辑
摘要:计算机中经常会有多个任务同时运行,其中总有一些看起来更紧急,更需要优先完成。比如我们现在有两个任务,一个任务是下载一部电影,另一个任务是检测用户的输入。显然及时响应用户操作应具有更高的优先级,因为我们不能让用户等得太久。 阅读全文

.net垃圾回收机制详解

2011-03-06 23:01 by 田志良, 1777 阅读, 6 推荐, 收藏, 编辑
摘要:作为一个.NET程序员,我们知道托管代码的内存管理是自动的。.NET可以保证我们的托管程序在结束时全部释放,这为我们编程人员省去了不少麻烦,我们可以连想都不想怎么去管理内存,反正.NET自己会保证一切。好吧,有道理,有一定的道理。问题是,当我们用到非托管资源时.NET就不能自动管理了。这是因为非托管代码不受CLR(Common Language Runtime)控制,超出CLR的管理范围。那么如何处理这些非托管资源呢,.NET又是如何管理并释放托管资源的呢? 阅读全文

IDisposable接口详解

2011-03-04 19:52 by 田志良, 5986 阅读, 4 推荐, 收藏, 编辑
摘要:本文详细介绍IDisposable在回收资源的应用。 阅读全文

ManualResetEvent详解

2011-03-04 11:25 by 田志良, 33660 阅读, 10 推荐, 收藏, 编辑
摘要:本文着重讲解ManualResetEvent如何实现线程同步,并附源代码哦。 阅读全文

c#前台线程与后台线程的区别和联系

2011-03-03 16:16 by 田志良, 21120 阅读, 11 推荐, 收藏, 编辑
摘要:.net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。 阅读全文

一封给“X教授”的回信(讨论Socket通信)

2011-03-02 18:44 by 田志良, 5537 阅读, 7 推荐, 收藏, 编辑
摘要:前几天“X教授”发Email与我讨论Socket通信方面的问题,主要涉及4个方面内容,现将回信公布出来,希望园友们能积极参与讨论,提出更好的解决方案。 阅读全文

通用守护进程的实现

2011-02-12 11:55 by 田志良, 23726 阅读, 27 推荐, 收藏, 编辑
摘要:用户指定要守护的应用程序(数量不限),该应用程序不仅包括exe可执行文件,还包括诸如jpg、txt等所有能双击打开执行的应用程序。用户设定好要守护的应用程序后,关闭应用程序(包括合法和非法关闭),该应用程序要能立即重启打开。当电脑重启时,要守护的应用程序也能自动全部打开。 阅读全文

Chapter 2.2:元数据通用查询类 MetadataHelper

2011-01-24 15:30 by 田志良, 1148 阅读, 2 推荐, 收藏, 编辑
摘要:本章主要介绍元数据通用查询类 MetadataHelper。 阅读全文

Chapter 2.1:WCF服务契约的重载与继承详解

2011-01-17 14:56 by 田志良, 2274 阅读, 5 推荐, 收藏, 编辑
摘要:本章主要介绍WCF服务契约的重载与继承,以及设计和分离服务契约的一般原则。 阅读全文

Chapter 1.5:WCF实践 托管

2011-01-11 19:32 by 田志良, 2165 阅读, 4 推荐, 收藏, 编辑
摘要:WCF服务类不能凭空存在。每个 WCF 服务都必须托管(Hosting) 在 Windows 进程中,该进程被称为宿主进程(Host Process)。单个宿主进程可以托管多个服务,而相同的服务类型也能够托管在多个宿主进程中。WCF 没有要求宿主进程是否同时又是客户端进程。显然,一个独立的进程有利于错误与安全的隔离。谁提供进程或是提供何种类型的进 程并不重要。宿主可以由 IIS 提 供,也 可以由 Windows Vista 的 Windows 激活服务(Windows Activation Service,WAS)提供,或者开发者直接将它作为应用程序的一部分。 阅读全文

Chapter 1.4:WCF实践 元数据详解

2011-01-11 10:15 by 田志良, 3284 阅读, 2 推荐, 收藏, 编辑
摘要:服务有两种方案可以发布自己的元数据。一种是基于 HTTP-GET 协议提供元数据,另一种是使用专门的终结点的方式。 WCF能够为服务自动提供基于 HTTP-GET 的元数据,但需要显式地添加服务行为(Behavior)以支持这一功能。行为属于服务的本地特性,例如是否需要基于 HTTP-GET 交换元数据,就是一种服务行为。 阅读全文

Chapter 1.3:WCF实践 HelloWorld

2011-01-10 19:10 by 田志良, 2298 阅读, 2 推荐, 收藏, 编辑
摘要:ServiceContract 特性可以将一个 CLR 接口(或者通过推断获得的接口)映射为与技术无关的服务契约。ServiceContract 特性公开了 CLR 接口(或者类)作为 WCF 契约。WCF 契约与类型的访问限定无关,因为类型的访问限定属于 CLR 的概念。即使将 ServiceContract 特性应用在内部(Internal)接口上,该接口同样会公开为公有服务契约,以便于跨越服务边界实现服务的调用。如果接口没有标记 ServiceContract 特性,WCF 客户端则无法访问它(即使接口是公有的)。这一特点遵循了面向服务的一个原则,即明确的服务边界。为满足这一原则,所有契约必须明确要求:只有接口(或者类)可以被标记为 ServiceContract 特性,从而被定义为WCF 服务,其他类型都不允许。即使应用了ServiceContract特性,类型的所有成员也不一定就是契约中的一部分。我们必须使用OperationContractAttribute特性显式地标明哪些方法需要暴露为WCF契约中的一部分。 阅读全文

Chapter 1.2:WCF体系架构详解

2011-01-10 15:23 by 田志良, 2207 阅读, 4 推荐, 收藏, 编辑
摘要:WCF 提供了对可靠性、事务性、并发管理、安全性以及实例激活等技术的有力支持,它们均依赖于基于拦截机制的WCF体系架构(WCF Architecture)。通过代理与客户端的交互意味着WCF总是处于服务与客户端之间,拦截所有的调用,执行调用前和调用后的处理。当代理将调用栈帧(Stack Frame)序列化到消息中,并将消息通过通道链向下传递时,WCF就开始执行拦截。通道相当于一个拦截器,目的在于执行一个特定的任务。每个客户端通道都会执行消息的调用前处理。链的组成与结构主要依赖于绑定。例如,一个通道对消息编码(二进制格式、文本格式或者 MTOM),另一个通道传递安全的调用上下文;还有一个通道传播客户端的事务,一个通道管理可靠会话,另一个通道对消息正文(Message Body)加密(如果进行了配置),诸如此类。客户端的最后一个通道是传输通道,根据配置的传输方式发送消息给宿主。 阅读全文

Chapter 1.1:WCF终结点详解

2011-01-10 11:53 by 田志良, 3530 阅读, 8 推荐, 收藏, 编辑
摘要:WCF(Windows Communication Foundation)是基于Windows平台下开发和部署服务的软件开发包。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。WCF是微软分布式应用程序开发的集大成者,它整合了.Net平台下所有的和分布式系统有关的技术,例如.Net Remoting、ASMX、WSE和MSMQ。以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于 Internet;以宿主程序而论,可以以ASP.NET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host)。WCF可以支持的协议包括TCP,HTTP,跨进程以及自定义,安全模式则包括SAML, Kerberos,X509,用户/密码,自定义等多种标准与模式。也就是说,在WCF框架下,开发基于SOA的分布式系统变得容易了,微软将所有与此相关的技术要素都包含在内,掌握了WCF,就相当于掌握了叩开SOA大门的钥匙。 阅读全文

远程应用程序域通信 MarshalByRefObject

2011-01-07 13:49 by 田志良, 2252 阅读, 2 推荐, 收藏, 编辑
摘要:应用程序域是一个操作系统进程中一个或多个应用程序所驻留的分区。同一应用程序域中的对象直接通信。不同应用程序域中的对象的通信方式有两种:一种是跨应用程序域边界传输对象副本,一种是使用代理交换消息。MarshalByRefObject 就是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。 阅读全文

delegate,event, lambda,Func,Action以及Predicate

2011-01-06 15:56 by 田志良, 3577 阅读, 3 推荐, 收藏, 编辑
摘要:1. delegate 委托 可以理解为cxx 语言中的函数指针,标示了方法调用的回调函数的规范。强类型,便于编译时检查是它的最大优点,从此可以和void * 说再见了。 2. event 事件 用以delegate委托声明事件,标示响应该事件的回调函数必须符合其声明委托的定义 3. lambda 表达式 在.net世界中表现为匿名委托,之前又要提到匿名方法(函数) 阅读全文

Lambda 表达式 和 Predicate 泛型委托

2011-01-06 14:36 by 田志良, 7163 阅读, 3 推荐, 收藏, 编辑
摘要:“Lambda 表达式”是一个匿名函数,用于创建委托或表达式树类型。 “=>”为Lambda 运算符,读为“goes to”。Lambda 运算符左边是“输入参数”,右边是“表达式或语句块”,如下所示: delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 } 阅读全文

有了WCF,Socket是否已人老珠黄?

2010-12-25 16:58 by 田志良, 9434 阅读, 6 推荐, 收藏, 编辑
摘要:WCF与WinSocket等底层技术之间实际上是一种“包含”关系,每一层都在下一层所提供服务的基础上,又扩充了新的功能,越外层的应用程序,可以使用的功能往往越多,开发效率往往也会更高。WCF在WinSocket的基础之上扩充了大量的功能,使用它可以很高效地开发网络应用程序,尤其非常适合于开发基于SOA的分布式软件系统,但这并不是说它可以完全把Socket打入冷宫。在不少场合,抛弃WCF那庞大的框架,直接使用Socket更合适。 阅读全文

Http和Socket连接区别

2010-12-23 15:42 by 田志良, 4682 阅读, 8 推荐, 收藏, 编辑
摘要:要想明白Socket连接,先要明白TCP连接。手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。 建立起一个TCP连接需要经过“三次握手”: 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”( 阅读全文

浅析Base64

2010-12-01 17:31 by 田志良, 1125 阅读, 5 推荐, 收藏, 编辑
摘要:按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 阅读全文

ASCII,Unicode和UTF-8之间的区别和联系

2010-12-01 16:20 by 田志良, 1291 阅读, 3 推荐, 收藏, 编辑
摘要:我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。 ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。 阅读全文

如何避免System.OutOfMemonryException异常

2010-11-03 14:27 by 田志良, 2082 阅读, 2 推荐, 收藏, 编辑
摘要:在什么情况下会出现OutOfMemonryException呢?第一种情况:在试图新建一个对象时,垃圾收集器找不到任何可用内存,会抛出该异常,这种情况,我们是可以捕获该异常的;另一种情况是:CLR需要内存,而系统却不能提供,也会抛出该异常, 但此时,应用程序不能捕获该异常。 阅读全文

socket通信服务器整体架构概述

2010-10-28 16:50 by 田志良, 34985 阅读, 40 推荐, 收藏, 编辑
摘要:Socket服务器主要用于提供高效、稳定的数据处理、消息转发等服务,它直接决定了前台应用程序的性能。我们先从整体上认识一下Socket服务器,Socket服务器从架构上一般分为:网络层、业务逻辑层、会话层、数据访问层。 阅读全文

Try-Catch机制使用场景分析

2010-10-09 15:37 by 田志良, 4090 阅读, 5 推荐, 收藏, 编辑
摘要:在什么场景下加Try-Catch机制 1)以业务逻辑功能为单位,在最上层加Try-Catch机制。为什么要这样做呢?这主要是增加程序的健壮性,防止因抛出异常过多,导致程序崩溃。 2)底层代码,在可能出错的地方加Try-Catch机制,用Catch侦测具体的异常,然后就具体的异常,采取相应的解决方案。 3)底层代码,在需异常追踪时加Try-Catch机制,在Catch块中抛出自定义异常,调试时可迅速定位到错误代码段。 阅读全文

浅析 c# Queue

2010-09-21 16:02 by 田志良, 24499 阅读, 6 推荐, 收藏, 编辑
摘要:1、Queue 的容量是 Queue 可以保存的元素数。Queue 的默认初始容量为 32。向 Queue 添加元素时,将通过重新分配来根据需要自动增大容量。可通过调用 TrimToSize 来减少容量。等比因子是当需要更大容量时当前容量要乘以的数字。在构造 Queue 时确定增长因子。默认增长因子为 2.0。 2、Queue 能接受空引用作为有效值,并且允许重复的元素。 3、空引用可以作为值添加到 Queue。若要区分空值和 Queue 结尾,请检查 Count 属性或捕捉 Queue 为空时引发的 InvalidOperationException异常。 阅读全文

深入理解堆栈、堆在内存中的实现

2010-09-19 09:46 by 田志良, 23658 阅读, 13 推荐, 收藏, 编辑
摘要:尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(GarbageCollection),但是我们还是应该了解它们,以优化我们的应用程序。同时,还需要具备一些基础的内存管理工作机制的知识,这样能够有助于解释我们日常程序编写中的变量的行为。在本文中我将讲解栈和堆的基本知识,变量类型以及为什么一些变量能够按照它们自己的方式工作。 在.NET framework环境下,当我们的代码执行时,内存中有两个地方用来存储这些代码。假如你不曾了解,那就让我来给你介绍栈(Stack)和堆(Heap)。栈和堆都用来帮助我们运行代码的,它们驻留在机器内存中,且包含所有代码执行所需要的信息。 阅读全文

实现SQL池(多线程),定时批量执行SQL语句

2010-09-11 14:39 by 田志良, 12717 阅读, 6 推荐, 收藏, 编辑
摘要:在实际项目开发中,业务逻辑层的处理速度往往很快,特别是在开发Socket通信服务的时候,网络传输很快,但是一旦加上数据库操作,性能一落千丈,数据库操作的效率往往成为一个系统整体性能的瓶颈。面对这问题,我们怎么办呢?好,下面我就为大家介绍一种方法:构建SQL池,分离业务逻辑层和数据访问层,让业务逻辑层从低效的数据库操作解脱,以提高系统整体性能。SQL池是SQL容器,用于存放业务逻辑层抛过来的SQL语句。特别提醒一下,SQL池是面向多线程的,所以必须对公共资源SQL采取锁机制。这里采用互斥锁,当业务逻辑层线程往SQL池中抛入SQL语句时,禁止SQL执行线程执行SQL语句,反之,当SQL执行线程执行SQL语句时,也不允许业务逻辑层线程往SQL池中抛入SQL语句。 阅读全文

深入探析 socket

2010-09-08 17:28 by 田志良, 114945 阅读, 46 推荐, 收藏, 编辑
摘要:最近浏览了几篇有关Socket发送消息的文章,发现大家对Socket Send方法理解有所偏差,现将自己在开发过程中对Socket的领悟写出来,以供大家参考。   (一)架构   基于TCP协议的Socket通信,架构类似于B/S架构,一个Socket通信服务器,多个Socket通信客户端。Socket通信服务器启动时,会建立一个侦听Socket,侦听Socket将侦听到的Socket连接传给接受Socket,然后由接受Socket完成接受、发送消息,当Socket存在异常时,断开连接。在实际开发项目中,往往要求Socket通信服务器能提供高效、稳定的服务,一般会用到以下技术:双工通信、完成端口、SAEA、池、多线程、异步等。特别是池,用的比较多,池一般包括一下几种: 1)Buffer池,用于集中管控Socket缓冲区,防止内存碎片。 2)SAEA池,用于集中管控Socket,重复利用Socket。 3)SQL池,用于分离网络服务层与数据访问层(SQL的执行效率远远低于网络层执行效率)   (二)Send   主服务器接受Socket为一端口,客户端Socket为一端 阅读全文

c# 多线程 --Mutex(互斥锁)

2010-09-01 14:17 by 田志良, 14087 阅读, 6 推荐, 收藏, 编辑
摘要:互斥锁(Mutex) 互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它。 互斥锁可适用于一个共享资源每次只能被一个线程访问的情况 函数: //创建一个处于未获取状态的互斥锁 Public Mutex(); //如果owned为true,互斥锁的初始状态就是被主线程所获取,否则处于未获取状态 Public Mutex(bool owned); 如果要获取一个互斥锁。应调用互斥锁上的WaitOne()方法,该方法继承于Thread.WaitHandle类 它处于等到状态直至所调用互斥锁可以被获取,因此该方法将组织住主调线程直到指定的互斥锁可用,如果不需要拥有互斥锁,用ReleaseMutex方法释放,从而使互斥锁可以被另外一个线程所获取。 阅读全文

c# Stack操作类

2010-09-01 08:35 by 田志良, 7796 阅读, 2 推荐, 收藏, 编辑
摘要:Stack类代码: using System; //using System.Collections.Generic; using System.Text; using System.Collections; namespace StackHelper { class StackHelper { private Stack list; public Stack List { set { list = value; } get { return list; } } public StackHelper() { list = new Stack();//注意:不是list=new StackHelper() Console.WriteLine("---------Stack-----------"); } 阅读全文