摘要: 一直以来对于lock关键字的用法都存有疑惑,也从网上看到很多关于他的资料包括MSDN,无奈MSDN讲述的真是让人上火。今天决定小小研究一下一直都知道lock是锁定某一变量从而实现对某一代码段的独占执行。但是对于lock(this)、lock(typeof(类名))、lock(字符串)、lock(公有变量) lock(私有变量) 有什么不同 却很是模糊我假定了这样一种场景:某个时刻,只允许一个客户在打电话定义一个客户类代码1:(lock(this))[代码]在主函数中调用,先实例化一个Custmer 实例[代码]可以预先分析一下结果,因为用的是lock(this),而this这时候代表的是实例c 阅读全文
posted @ 2010-12-21 17:38 m苗子 阅读(504) 评论(1) 推荐(0) 编辑
摘要: 在做WinForm开发时,我们经常用到的提示恐怕就是MessageBox。但是有时提示过于频繁导致用户无法工作,比如,如果系统一直在循环尝试连接到服务器,如果连接不上则会循环提示用户无法连接服务器。这种情况下,恐怕用MessageBox就有点暴力啦。替代方法,可以换成把提示显示在窗体界面上,但是不够醒目,那怎样好呢,QQ提示窗,有动画的效果又不会频繁的提示,好的问题解决。那么看看怎么实现吧实现QQ提示框,核心是用到系统库user32.dll代码1:[代码]在添加了对库函数的引用之后,下一步就是创建一个窗体了,用来显示系统的提示消息。在窗体上放一个Label用来显示消息内容。代码2:[代码]在主 阅读全文
posted @ 2010-12-21 15:36 m苗子 阅读(2246) 评论(6) 推荐(2) 编辑
摘要: 当我们用ListView显示数据时,有一种很人性化的设计便是单击ListView某一列,该列则以升序或降序排列。 自己定义一个类继承自IComparer接口 代码如下: [代码]在ListView的ColumnClick事件中调用代码如下 [代码]最后要说一下,当我们调用ListView的Sort方法时,就会去隐式调用ListViewItemSorter属性对应的类实现的ComPare方法 阅读全文
posted @ 2010-12-20 14:11 m苗子 阅读(6245) 评论(0) 推荐(1) 编辑
摘要: 有时候,我们可能会有这样的需求,希望程序只运行一个实例。因为可能运行多个实例会导致某一些问题。初步想法:添加一个标志变量,用来标志是否有程序实例在运行。可能一下想到定义一个bool变量,这个想法没错,但是应该用什么逻辑来表示这个bool变量的值呢?换句话说,应该在什么情况下给bool变量true值呢?这又是个问题,所以单纯的使用bool变量时行不通的,必须给它找个依托,于是我们还需要一个Mutex变量(一个信号量),如果信号量第一次创建,那么bool变量为true,如果信号已经存在,那么bool变量为false。代码如下:[代码]写这篇博文时,突然有一点感受那就是,代码的逻辑其实与生活是休戚相 阅读全文
posted @ 2010-12-20 10:59 m苗子 阅读(356) 评论(0) 推荐(0) 编辑
摘要: 初步想法:是用TextBox.ReadOnly=true;但是这样连刷卡输入都会被禁掉第二种想法:判断是键盘输入还是用户刷卡 但是怎么判断呢 --键盘输入应该触发的是KeyDown事件之类的 那刷卡呢 结果也是触发的相同事件第三种想法——迂回:因为卡号是特定长度的 刷卡在短时间内就能输入到特定长度 而用户输入至少也要4s以上 通过这个时间判断 便可以分辨出来时手动输入还是刷卡输入我用了一个Timer控件 经过调试其属性Internal设置为200ms代码如下:代码 阅读全文
posted @ 2010-12-20 10:45 m苗子 阅读(1597) 评论(0) 推荐(0) 编辑
摘要: 在做C# WinForm开发时 一直都觉得.NET自身提供的控件组合到一起的界面太难看 于是在leader的推荐下 使用了DevComponets.DotNetBar 这个库里提供了许多功能类似于.Net控件功能的控件 不过 有一点就是界面做的很好看 仿office的 之前用着一直没有出现什么异常 今天用到其中的ListViewEx 在窗口最小化的时候产生异常 异常如下See the end of this message for details on invoking just-in-time (JIT) debugging instead of this dialog box.****** 阅读全文
posted @ 2010-12-17 15:20 m苗子 阅读(6459) 评论(0) 推荐(0) 编辑
摘要: Thread.Join()方法,顾名思义,在一个线程中加入一些东西。MSDN上解释其作用为:阻塞 “调用线程” 直到某个线程结束。 这个翻译过来的解释有点晦涩。举个例子如下:static void Main(){ Thread t=new Thread(new ThreadStart(ThreadMethod)); t.Start();t.Join(); Console.W... 阅读全文
posted @ 2010-10-22 11:28 m苗子 阅读(13417) 评论(0) 推荐(0) 编辑
摘要: 在讨论WaitHandle类之前 我们先看一张MSDN上给的继承关系图: 红色框指出的部分,就是这篇文章要讨论的WaitHandle类,绿色框指出的部分就是本文提到的一些异步对象。可以看到,异步对象的父类就是WaitHandle异步对象如AutoResetEvent和ManualResetEvent定义了一种信号机制,这种机制用来表明是访问共享资源还是释放共享资源。1. WaitHanle类MSD... 阅读全文
posted @ 2010-10-21 16:56 m苗子 阅读(3275) 评论(2) 推荐(0) 编辑
摘要: AutoResetEvent也是一个同步对象,它用于对资源的独占访问。当AutoResetEvent处于终止状态时,如果存在等待的线程,则在该线程执行后,AutoResetEvent变量将自动变为非终止状态。代码示例:代码代码中,我们关注AutoResetEvent同步对象。从代码中我们可以看到 CalFirst、CalSec、CalThird方法中 都有一句AutoEvents[].Set()代... 阅读全文
posted @ 2010-10-21 16:42 m苗子 阅读(491) 评论(0) 推荐(0) 编辑
摘要: ManualResetEvent 用于线程同步,通知一个或多个线程某事件已经发生。通常用于一个线程执行的任务必须在其他线程的任务执行之前完成。ManualResetEvent状态分为两种:终止状态和非终止状态。当某一任务完成时,将ManualResetEvent设置为终止状态,这样其他等待的线程(一个或多个)将开始执行自己的任务。注意:一旦它被终止,它将保持终止状态,直到它被手动重置。代码示例:代... 阅读全文
posted @ 2010-10-21 16:23 m苗子 阅读(790) 评论(0) 推荐(1) 编辑