摘要: 上一章我们讨论到了解决方案,本文着重讨论一下该方案的实现. 一. 排它锁类的实现: 我们实现一个类TimeSpanWaitor,用它来控制排它锁的获取和释放,其实该类的实现的目的很简单,那就是实现一个方法,该方法接受一个时间片段和一个函数回调(该函数返回bool)的参数,该方法在指定时间片段内不断的轮值排它信号,并在每次获得排它信号时调用传入的函数,当该函数返回True时则返回,否则就一值轮值排它信号直到超时. 如下:1.轮值排它信号,该过程尝试获取排它信号,如果获取成功则调用回调函数,并根据回调函数返回相应状态.否则返回下一次继续的状态. 2.如果上一次轮值状态是返回继续则线程随机停顿后循. 阅读全文
posted @ 2011-05-29 17:04 悠竹客 阅读(2115) 评论(0) 推荐(1) 编辑

摘要: 最近发表过一些对c#多线程数据读写安全线的文章,有网友说都是代码不好理解,我在这里就给出我的一些解释,希望大家多多指较.这里我重复一下多线程数据读写安全的观点:多线程下的数据安全应该指的是在使用数据的生存期内它是不变的,使用数据的生存期可以是一个过程或函数,当然这里的指的数据不包含过程或函数中的局部变量,因为局部变量它本身就是线程安全的数据. 目标:确保数据在使用的生命期内是不变的. 解决思路:对于数额的使用不外乎就是读和写,而读操作对数据是不会产生变化的,仅有写操作才对数据产生变化,试想一下两个线程同时对同一数据进行读和写操作,那么读出的数据很可能在使用过程中被写操作改变了,那么依据原先读. 阅读全文
posted @ 2011-05-26 12:50 悠竹客 阅读(9170) 评论(10) 推荐(4) 编辑

摘要: 在c#中使用多线程同步是一个头痛的问题,比较经常用的是lock(object){}这种方法,但是这种方法在读多写少的时候比较浪费资源,当然c#也提供了一种读写锁,我这里只是提供一个原创读写锁的类的源代码,该类的主要目的是允许多个线程同时读,而仅允许一个线程写,而用lock是不论读写都只能一个线程运行的有兴趣的可以看看讨论讨论,以下是源代码: public sealed class MutilThreadReadWriterLock : IReadWriteLock,IDisposable { static MutilThreadReadWriterLock() { EmptyNullDispo 阅读全文
posted @ 2011-05-23 16:38 悠竹客 阅读(7087) 评论(17) 推荐(3) 编辑

摘要: 有时你在编程时不得不使用如下的签名方法: void DoSomething(object par) 而其中的参数par偏偏又常常是值类型,比如int,bool,short之类的类型,在方法过程中你又不得不使用(int)par,(bool)par,(short)par之类的语句来取消包装,这样一来调用该方法时无形中就增加了包装和反包装的资源开销,可以预料得到当你的代码中有许多此类的常用方法签名时,会给你的系统带来巨大的隐形开销.如何避免?这是本文探讨的地方.1.尽量避免使用object类型的值包装签名,这句话可能大家都会说,其实跟废话一样,能够用实参的类型大家当然都用实参类型签名了.只有没办法. 阅读全文
posted @ 2011-03-04 12:21 悠竹客 阅读(385) 评论(1) 推荐(1) 编辑

2012年6月21日

摘要: 近几天在网上查阅了一些关于EXCEL文档的存储格式的文章,总结出该类文档存储的组织方式,对于文件内的流(如Workboot,sheet)等的存储格式(BIFF格式)还在研究中,现仅将该类文档的流组织心得贴出来.请大家探讨一下: 复合文档(Compound Document)存储的数据结构一、文件存储结构该文件存储组织方式是:起始有512字节的文件头,然后是固定长度的n个扇区。文件头 扇区(SID=0) 扇区(SID=1) 扇区(SID=2) 扇区(SID=3)………扇区(SID=n-1) 扇区(SID=n)文件头包含了一些重要的信息,如扇区大小、扇区分配等等信息。因此该文件的长度总是512+. 阅读全文
posted @ 2012-06-21 11:56 悠竹客 阅读(1508) 评论(0) 推荐(0) 编辑

2011年12月26日

摘要: 前两章分别讲了Socket的数据传输,本章开始将在前两章的基础上构建一个消息传输机制. 因为服务端和客户端都离不开消息的传输,所以先讲如何在前两章的基础上构建消息传输的信道,本例构造了一个类MessageSession,该类负责消息在网络中传送,并且该类实现了一个接口IMessageSession,其目的同前一章实现接口的目的一样,都是为了方便以后的扩展,该类的主要传输主体为一个接口IMessage,可以说这是一个消息调用的接口,是为了远程调用而定义的一个接口,本篇中先给出它的接口定义,其实现在后续章节中给出IMessage接口的定义如下:IMessage 1 using System; 2. 阅读全文
posted @ 2011-12-26 12:31 悠竹客 阅读(2495) 评论(8) 推荐(1) 编辑

2011年12月25日

摘要: 在前一篇讲到了服务侦听,具体构建了一个抽象类,该类是后续服务类中SOCKET通讯服务的基类,而SOCKET通讯中不论是服务端还是客户端都需要数据收发,客户端对应服务端侦听的部份则是连接,下面就讲讲连接和数据收发1.连接 该部份比较简单,只有三个简单的函数:CreateConnectToRemoteSocket,ConnectToRemoteCore,AsyncConnectToRemoteCore, CreateConnectToRemoteSocket:创建连接的Socket,其中CheckSockectIsConnected是检查是否已连接(该函数用了MS使用的例子来判断是否已连接),最. 阅读全文
posted @ 2011-12-25 12:17 悠竹客 阅读(3038) 评论(7) 推荐(4) 编辑

2011年12月23日

摘要: 本篇文章讲述Socket的通讯,为基于Socket通讯的C/S模型提供基础. Socket通讯通常由两部份组成,一个服务侦听端,一个客户连接端,服务端侦听进站的消息,客户端发送出站的消息,二者不可或缺,下面先讲服务端侦听,该类定义为TcpIpListener(一个抽象类):1.侦听Socket的创建:CreateListenSocket 该过程比较简单:在该过程中初始化了侦听Socket(g_ListenSocket),使用IP地址族,流类型,Tcp传输控制协义三个参数创建Socket,并且将其关联到侦听端口(对于侦听Socket这个一定要),另外在该过程中还处始化了一个信号量g_MaxSe. 阅读全文
posted @ 2011-12-23 13:38 悠竹客 阅读(3130) 评论(3) 推荐(2) 编辑

2011年5月24日

摘要: 个人的理解:多线程下的数据安全应该指的是在使用数据的生存期内它是不变的,使用数据的生存期可以是一个过程或函数,当然这里的指的数据不包含过程或函数中的局部变量,因为局部变量它本身就是线程安全的数据.那如何做到呢?最简单的方法是使用lock(object)来锁定,但它存在一个效能问题,试想一下在一个多数情况下是读操作而只有少数情况是写操作的环境下,如果使用lock来锁定的话,一个线程的读操作必需等待另一个线程的读操作完成后才能进行,而读操作是不会改变数据的,完全没有必要等待另一个读操作完成后再进行的,他们应该是可以并行执行的,这样效能就低了.另一个方法是使用Monitor来锁,这个方法同lock是 阅读全文
posted @ 2011-05-24 11:41 悠竹客 阅读(1961) 评论(0) 推荐(2) 编辑

2010年10月16日

摘要: 该控件值得关注的属性有以下几个:ShadowColor 获取或设置阴影的颜色ShadowBrush 获取或设置阴影的画刷 上述两个属性当ShadowBrush不为null时使用ShadowBrush否则使用ShadowColor,一般使用ShadowColor效果好,使用ShadowBrush不容易控制效果ShadowLightArc 获取或设置光源照射角度(顺时针,以度为单位) >=0且&... 阅读全文
posted @ 2010-10-16 09:48 悠竹客 阅读(6119) 评论(7) 推荐(2) 编辑

导航