随笔分类 - C#
摘要:最初学习多线程的时候,只学了用Thread这个类,记忆中也用过Mutex,到后来只记得Thread的使用,其余的都忘了。知道前不久写那个Socket连接池时遇到了一些对象如:Semaphore,Interlocked,Mutex等,才知道多线程中有这么多好东西,当时用了一下有初步了解,现在来熟悉熟悉。 本文介绍的多线程这个“象群”包括:Interlocked,Semaphore,Mutex,Monitor,ManualResetEvent,AutoRestEvent。而使用的例子则有车票竞抢和类似生产者消费者的Begin/End(这里的Begin/End跟异步里面的没关系)两个事件模型。...
阅读全文
摘要:对MVP模式的接触,是我偶然一次在百度上搜MVC的时候开始,当时对MVC都不了解,甭说MVP了。后来MVC弄懂了,现在就来了解一下MVP。MVP 是从经典的模式MVC演变而来的,难怪看那个结构图有点相像。MVC模式的结构图,M,V,C各代表什么不说了 MVP模式的结构图,M和V的含义跟MVC中的结构一样,区别的就是C(Controller)和P(Presenter)。感觉这个区别就导致了模式产生性质的变化。至少从几何角度来看,由一个稳定的三角型变成一条直线。在MVC中即使在Controller对View和Model的控制之下,View和Model之间仍然有联系,至少View上控件绑定的数...
阅读全文
摘要:前几天写了篇有关写Web服务器的博文,写得不好,多亏园友们的意见,给了我继续探究的动力。这篇就关于上次做的Web服务器做了些更改。 1.支持ASPX页面的访问多亏了园友的提点,使用了ApplicationHost类,使得宿主程序能够处理ASP.NET请求。后来上网搜了一下,原来就是写一个ASP.NET的宿主程序。上MSDN看了一下还不怎么明白,终究还是找了一些博文来看才明白。ApplicationHost属于System.Web.Hosting命名空间,要使用这个类要添加System.Web.dll引用。先上一点代码再解释吧1 private AspxCreator...
阅读全文
摘要:自己写一个使用Http协议的服务器。在谷歌搜了一下,发现其实.NET Framework里面本身提供了HttpListener类,看别人的博文介绍是它是对Socket的简单封装,也有一些人没有用这个类,还是直接用Socekt写了服务器。说是Socket的扩展性反而比较好。HttpListener毕竟是微软封装好的,安全性应该一般会比用Socket写的要高,如果大牛写的就不同了,像我这等水货,其实还是用HttpListener要好一些。但也是个尝试,也是学习,我尝试用Socket写。虽然说是基于Socket,但实际上用的Socket的连接池。连接池的实现细节在上一篇博文《Socket连接池》..
阅读全文
摘要:“池”这个概念好像最早是在操作系统的课上听过的,到后来出来工作的第二天组长也跟我提起“池”这个东东。它给我的感觉是某种对象的集合,如果要用的话就取出,不用的话就放回。在学多线程的时候有接触过线程池,在写《Socket 一对多通信》的时候想到了Socket连接池这回事,不过在网上谷歌了一下,发现这类的文章貌似不多,看了一下园友的博文《高性能Socket设计实现》,获益良多,下了份源码来看,虽然有一部分看不明白,而且由于个人水平跑不了那份代码,但是从中我学到了不少,至少我写的“池”有一部分是用了这位田大哥的思想。 先来分析各个类之间的结构,整个连接池里面实际上是有两个池,一个是在异步通信中可...
阅读全文
摘要:上一次的博文说错了东西,幸好有园友指出。才把错误改正过来,顺便也把利用SocketAsyncEventArgs进行Socket异步通信这方面的知识整理一下。 之前看了网上的代码,每进行一次异步操作都new 一个SocketAsyncEventArgs对象,然后网友评论太浪费资源了,于是就误以为用BeginXXX进行Socket异步通信会更优,幸好有园友指出我的误区,再看了这篇文章《net3.5与.net2.0 Socket性能比较》之后才发现SocketAsyncEventArgs是.NET Framework 3.5才出现的,而IAsyncResult是.NET Framework ...
阅读全文
摘要:异步这个词以前在课堂上也听过,那时候只是听,直到在做项目的时候用到多线程,在体会到异步是怎样的,到最近做的东西对异步更加深刻了,进程通信时调Windows API SendMessage和PostMessage的区别。最近搞的Socket编程也是有异步的,Socket当然要有异步才行,不然服务端Accept一次就卡一次在那里,客户端Connect一次就卡一次。每Send一次,Receive一次都会卡一次,这样不好。 在网上谷歌过一下,发现Socket的异步可以有两种方式,一种是用 SocketAsyncEventArgs 配合AcceptAsync,SendAsync,ReceiveAs...
阅读全文
摘要:这篇文章橙色的文字都是废话,不耐烦的园友可以跳过那些文字。包括这句话。 最初接触Socket编程的是在学校的java课上,可那时候没心学java,老师讲的Socket也没怎么理会,上机操作时,上网拷了一段C#的客户端和服务端代码,分别与java写的服务端和客户端进行通信。至于整个通信流程是怎样的没理会,直到写上一篇博文时才清楚。 还记得那时候上课老师问过如果一个服务端要跟两个客户端通信,那怎么办?接着他复制粘贴了一下创建Socket,绑定,监听那几行代码。1 ServerSocket ss1 = new ServerSocket(8081);2 Socket s1 = ss1.acce...
阅读全文
摘要:基础比较差,知识不够全面,Socket编程方面还是个空白页,网上关于这方面的文章不少,学习了之后,做一下笔记。关于Socket的概念等基础知识我就不想累赘了。本文只想通过跟实际的事情的类比来记忆一个很简单的Socket编码过程。好,直奔主题。话说有个呆子A君,想干这个客服,他就先搞到一个能正常通话的手机,能正常通话肯定会有电话号码。那么客服人员A君,向外公布了他的客服电话,管他是通过什么途径,总之有人知道就行了。总之这个A君就等啊等啊 等着他的电话响。花开两朵各表一枝。有个茂利B君也不知通过什么途径得到了A君的电话,于是B君掏出他的山寨手机。B君迅速拨号,嘟嘟嘟。。。。与此同时,A君的电话响了
阅读全文
摘要:近日与同事聊天提及到进程通信,还没搞过,于是就谷歌一下。发现实现进程通信的方法也不只一种,调用Windows API的,用IPC通道的,共享内存,利用Socket、配置文件、注册表等等。我后来尝试的只有IPC通道和Windows API。而用API的还有分同步的SendMessage和异步的PostMessage。目前来看用API的大部分都是用SendMessage。我也分别介绍一下吧。IPC通道用IPC通道其实是Remoting里的其中一种,这种方式用起来感觉有点像Web Service。首先定义一个类,这个类供通讯的目标进程调用。 1 public class IPCMessa...
阅读全文
摘要:有不少园友指点,用NPOI操作Excel会比用ADO.NET 和COM 要好,于是尝试一下用NPOI封装一个ExcelHelper,在使用本类之前,要添加NPOI.dll引用。要添加两个个命名空间 using NPOI.SS.UserModel;using NPOI.HSSF.UserModel;类代码如下: 1 public class NPOIExcelHelper 2 { 3 #region 公共方法 4 5 #region 导出 6 7 /// 8 /// 数据导出 9 ...
阅读全文
摘要:近日突发奇想,封装一个Excel的帮助类,好让日后做一些Excel操作时方便一点,至少导入导出会方便点吧。不过在封装过程中发现自己太差劲了,问题多多,搞这么百来行代码花了很长时间,于是写篇日志,记录一下这个ExcelHelper,也顺便记录一下封装过程中遇到的一些问题。整个Helper中包括了读和写两部分,读是利用ADO.NET的OleDB进行读,与查询SQL Server很相像,查询语句是这种形式SELECT * FROM [Sheet1$A1:A10]“$”符号后面可以加一个范围,表明要读取哪一部分,如果不加的话就表明全表读取了。下面则是读那部分的方法,一个是通用的查询,另一个则是导入 1
阅读全文
摘要:本文只列举一个压缩帮助类,使用的是有要添加一个dll引用ICSharpCode.SharpZipLib.dll。另外说明一下的是,这个类压缩格式是ZIP的,所以文件的后缀写成 .zip还有,如果用这个类来解压rar格式的压缩文件时会报错,就网上说的那个"Wrong Local header signature: 0x21726152"异常。只要解压ZIP压缩格式的压缩文件就不会报错了。 下面就是Helper类的代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using
阅读全文
摘要:日前收到一个小任务,要做一个通用的在线升级程序。更新的内容包括一些dll或exe或、配置文件。升级的大致流程是这样的,从服务器获取一个更新的配置文件,经过核对后如有新的更新,则会从服务器下载相应的文件更新到被升级的程序目录下。如果被升级的程序在升级之前已经启动,程序则会强制关闭它,待到升级完成之后重新启动相应的程序。在升级之前程序会自动备份一次,以防升级失败造成程序不能运行。首先来的是数据实体 1 public class FileENT 2 { 3 public string FileFullName { get; set; } 4 5 ...
阅读全文
摘要:做了几个项目,有接触过MVC,不过不是用微软定义的那套MVC的框架,是别人写的一个很简单的MVC框架。因此对于微软的那个MVC框架,无论几点零版本的。鄙人还不会用。近日从 lulu Studio的系列博文 《ASP.NET MVC 入门系列教程》从头学起。 先对项目简单了解一下 在上图中可以明显的看到MVC那三个玩意了:代表M的模型(Model),代表V的视图(View),代表C的控制器(Controller)。就是下图这个经典的品字形图,了解过MVC的肯定见过。 图上原本有的一些文字就不列出来的,但光看这些东西还是对MVC一头雾水的。至少请求的过程还不知道是什么回事。那就回到还没用...
阅读全文
摘要:本文定义了一个DBHelper类,是SQLite的。需要添加一个System.Data.SQLite的dll,可以到SQLite的官网下载。类的代码如下 1 using System; 2 using System.Data; 3 using System.Data.SQLite; 4 using System.Configuration; 5 using System.Collections; 6 7 namespace Common 8 { 9 public abstract class SQLiteHelper 10 { 11 //Da...
阅读全文
摘要:本文记录各种数据库与.NET类型的对照,包括Oracle,SQL Server,MySQL,SQLite首先是Oracle的 序号Oracle数据类型.NET类型1BFILEbyte[]2BLOBbyte[]3CHARstring4CLOBstring5DATEDateTime6FLOATDecimal7INTEGERDecimal8INTERVAL YEAR TO MONTHInt329INTERVAL DAY TO SECONDTimeSpan10LONGstring11LONG RAWbyte[]12NCHARstring13NCLOBstring14NUMBERDecimal15NVA
阅读全文
摘要:在开发基于三层架构的项目初期,都会按照数据库的表结构定义一堆的实体类,但是一个表里有那么多的字段,一个库又有那么多个表,建这些实体类的工作量不少,作为一个懒人,肯定想些法子解决这么麻烦的问题。写一个实体生成器。 为了生成器能兼容各仲类型的数据库,我把生成器的架构定义成如下形式 还是说明一下吧!在数据库的上一层定义了各种数据的Controler,负责建立各种数据的连接等等,在DAL的每一个类都实现IDAL接口,每一种数据库的DAL类都定义了各自查询SQL,在BLL处通过读取配置,获知当前需要对哪个类型的数据库操作,再通过反射机制动态生成相应的DAL实例。这样如果再有新的数据库类型,只要添...
阅读全文
摘要:最近做的一个Web项目需要对URL进行过滤,在网上搜了一下,知道J2EE有个Filter的东西,而在.NET方面,其实也可以实现。 下面是类的定义。 为了实现过滤的效果,Filters类需要实现IHttpMoeld接口,实现该接口需要有两个方法,一个是Dispose,另一个是Init。Init的参数
阅读全文
摘要:第一次自主封装Util类,尝试封装一个日志的操作类LogUtil,逻辑不复杂,也没调用那些复杂的类,只是简单的IO操作。 1 using System; 2 using System.IO; 3 4 namespace Common 5 { 6 /// <summary> 7 /// 日志类 8 /// </summary> 9 public static class LogUtil 10 { 11 /// <summary> 12 /// 配置默认路径 13 /// </summary...
阅读全文