对象获取器IObjectRetriever -- ESBasic 可复用的.NET类库(17)
1.缘起:ESBasic中许多管理对象的容器都用到了这个ESBasic.ObjectManagement.IObjectRetriever接口,所以单独将其提出来介绍一下。当我们向对象容器(Container)请求某个对象时,也许目标对象还未加载到容器中,这可能是因为容器在初始化的时候就没有加载这个...
MBTI职业性格测试
MBTI职业性格测评问卷MBTI人格理论的基础是著名心理学家卡尔•荣格先生关于心理类型的划分,后经一对母女Katharine Cook Briggs 与Isabel Briggs Myers研究并加以发展。这种理论可以帮助解释为什么不同的人对不同的事物感兴趣、善长不同的工作、并且有时不能互...
定时刷新缓存管理器 IRefreshableCacheManager --ESBasic 可复用的.NET类库(16)
1.缘起: 为了提升系统的性能或减轻数据库的压力等原因,我们经常在系统中使用缓存来把那些经常使用的数据保留在内存中。如果因为某些原因,缓存中这些经常使用的数据不能及时与数据源进行同步更新,那么采用定时刷新缓存中的数据有可能就是一种合适的选择。 如果你的缓存是定时刷新,那么你就需要自己为其维护一个定时...
WinForm二三事(一)补遗
在WinForm二三事(一)里,我们谈了WinForm上的事件(比如点击啊,双击啊)是借助消息循环,消息分发的机制实现的。但那篇里只是一笔带过。后来有人问我这中间的具体关系是什么呢?那今天我们就来详细谈谈从Win32的Message到WinForm上的Event。 Win32中的Hello wor...
WinForm二三事(二)异步操作
监视消息循环 在上一篇文章中,我们讨论了消息循环是响应用户输入的根本,还提到了在WinForm中执行耗时操作是因为这个耗时操作与消息循环在同一个UI Thread上,导致不能处理用户的后续响应,造成程序假死。除此之外,还说到了Form中的WndProc方法,说这个方法就是Win32时代那个处理消息...
对象池 IObjectPool -- ESBasic 可复用的.NET类库(15)
1.缘起: 对象池应该是一个“历史悠久”的概念了,像我们经常说的线程池、还有ADO.NET中的数据库连接池等,都属于对象池的应用。 我们的应用有时也会碰到需要使用对象池的情况,我举个例子说明一下。假设,我们需要记录某个类MyClass的每个方法每次被调用时方法执行所消耗的时间,而且,这个类是使用在多...
优先级管理器 IPriorityManager -- ESBasic 可复用的.NET类库(14)
1.缘起: 假设我们的订单处理系统所要处理的订单是有优先级的,也就是说,不同的订单类型所要求被处理的紧迫程度不同,对那些优先级高的注单要先处理,对于优先级低的注单可稍后处理。对于处于同一优先级的订单了,就按照其到达的先后顺序进行处理。 这是一个典型的管理具有优先级的对象的需求,注单就是具有优先级(W...
WinForm二三事(一)消息循环
在进入正文之前,想请大家先欣赏下面两段代码: 1: //这是一个控制台程序,请先添加System.Windows.Form.dll的引用 2: using System.Windows.Form; 3: 4: public class ConsoleApplicationShowDial...
[武汉站]Windows 7 社区发布活动
10月23日Windows 7将正式全球亮相,走进您的生活。 “让社区激情随Win 7 一同绽放”—— Windows 7 社区发布活动是微软公司为配合Windows 7全球同步上市而在微软.NET俱乐部社区开展的发布活动。10月24日和25日,将在全...
【讨论】从吉日的一段话说起+寻找WinForm架构的最佳实践
这两天园子里最火的莫过于吉日的白话反射,导致包子的批判,然后引来了老赵的两篇文章,然后又有若干人等一堆反射技术文章出世。可谓百花齐放,百家争鸣啊。喜欢这种氛围,呵呵。今天我不谈反射,但和反射有关不谈吉日,但话题是从这里开始吉日的《白话反射》里说到:"我们在开发大型软件项目时经常会遇到,系统很庞大了有...
双向映射 IBidirectionalMapping -- ESBasic 可复用的.NET类库(11)
1.缘起:假设我们的用户管理系统要求用户的ID和Name都必须是唯一的,并且用户的ID和Name一经确定就不能被修改。而且管理系统经常需要根据ID来查找Name,也经常需要根据Name来查找ID。根据这样的需求,我们可以考虑使用一个Dictionary来将ID和Name缓存起来,通常ID作为Key,...
简易的读写锁 SmartRWLocker--ESBasic 可复用的.NET类库(10)
1.缘起: 对于需要进行线程同步的地方,我们经常用的就是.NET内置的lock关键字和ReaderWriterLock类。lock的功能相对简单,因为它不区分读写,也就是说如果都在lock块中,读线程都会阻塞另一个读线程,在很多读远远多于写的应用中,这会极大地折损性能。所以我们也经常需要使用读写分离...
心跳监测器 IHeartBeatChecker -- ESBasic 可复用的.NET类库(09)
1.缘起:假设我们的C/S系统中服务端与客户端之间采用UDP进行通信,那么服务端如何知道每个客户端当前是否仍然在线了?有可能某个客户端一直没有退出,但是在很长一段时间内都没有与服务端作任何通信,那么服务端就应该认为这个客户端已经离线了吗?为了能让服务端掌握每个客户端是否在线的状态,我们可以这样做,只...
定时任务管理器 TimingTaskManager -- ESBasic 可复用的.NET类库(08)
1.缘起:假设我们的报表系统需要在每天的00:05:00统计前一天的报表数据,需要在每周一的00:30:00统计上周的报表数据,又需要在每月1日的00:30:00统计上月的报表数据。这些报表统计任务是很常见的系统需求,对于类似这样的在指定时刻执行的定时任务,我使用ESBasic.Threading....
回调定时器ICallbackTimer --ESBasic 可复用的.NET类库(07)
1.缘起: 举个例子也许就能够说清楚回调定时器的用途。假设我的订单系统接收各种不同类型的订单,当订单A进来时,系统根据订单的类型和其它特征进行综合判断后,决定A订单要在2秒之后被方法M1处理;接下来收到的B订单经过同样的判断后,决定要在10秒后被方法M2处理,……。这时候就可以用回调定时器来管理这些...
循环任务切换器 CircleTaskSwitcher -- ESBasic 可复用的.NET类库(06)
1.缘起: 假设我的订单处理系统有这样的需求:将一天24小时分为4个时段,凌晨2:15到8:30采用A类型的处理器处理接收到的订单,8:30到14:00采用B类型的处理器,14:00到20:00采用C类型的处理器,20:00到第二天凌晨2:15采用D类型的处理器。 即我们的订单处理器需要在任一天的2...