WPF MVVM UI分离之<交互与数据分离>   在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下面的问题: 删除操作,假如需要先执行一部分数据的处理,然后删除界面列表中的子项,之后再执行其它数据的处理.请问此业务该放置于Xaml.cs文件,还是ViewModel中呢? 再如弹窗,提示框,设置列表的滚动等等. 此上一些操作,我们不应该把业务代码直接挪到cs文件中,因为删除操作绝大部分的代码都是数据的处理.…
回到目录 Monitor的介绍 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit()). 2.Monitor的常用属性和方法: Enter(Object) 在指定对象上获取排他锁. Exit(Object) 释放指定对象上的排他锁.…
回到目录 ThreadStatic ThreadStatic是C#里的一个特性,它可以让你的字段在一个线程里有效,但你不能控制这个字段在何时被回收,即如果声明一个int32的字段为ThreadStatic,然后你为它赋值时为100,那么它什么被恢复成默认值0,我们不得而知,这在开发时,我们可能只有手动将它设为0才行,比较难看,但也没办法,谁让咱们用了ThreadStatic呢,被声明为ThreadStatic之后,已经证明这个字段是静态化的,只不过它是被局限在一个线程内的. Quartz Qua…
回到目录 ConcurrentDictionary是.net4.0推出的一套线程安全集合里的其中一个,和它一起被发行的还有ConcurrentStack,ConcurrentQueue等类型,它们的单线程版本(线程不安全的,Queue,Stack,Dictionary)我们一定不会陌生,可以说是经常用到,一个类的实例里,有个属性是个字典,我们不加考虑的会用Dictionary,而当这个属性被提升为static静态的(类级别的)时候,我们就要考虑它的线程安全性了,因为它有可能被多个线程同时访问,当…
回到 目录 之所以写这篇文章,完全是因为这次代码审核,这次代码审核过程当中,出现了很多我认为基础知识不够扎实的问题,所以,打算把它们记录下来,共大家分享. 方法的override,即方法的覆写或者重写,有时还是习惯叫它英文override,它是指将父类的abstract或者virtual方法进行重新设计,可以将新的功能加入其中,看起来很不错,但在使用过程中,有时我们可能拿不准它,下面我说几点: 一 父类是抽象类,这时,它的实例化需要通过子类来完成,这时的override是子类最后重写的 二 父类…
回到目录 多看几篇 之所以写这篇文章完全是因为最近在研究FastDFS这个分布式的文件存储系统,当然这不是我第一次研究它了,就像我们去看一本书,我们不会只看一篇,而是一次次,一篇篇,每看一次会有新的收获,而研究技术,框架也是一样,每研究一次,同样会有不同层次的收获,这次主要把fastDFS的集群就配置了一下,客户端的多tracker,并在程序执行过程中,自己也分析了一下它的集群原理. 原理 事实上,和mongodb,cat等集群原理相似,fastDFS也是有个路由服务器(它被称为trackers…
linq将大部分SQL语句进行了封装,这使得它们更加面向对象了,对于开发者来说,这是一件好事,下面我从基础层面来说一下GroupBy在LINQ中的使用. 对GroupBy的多字段分组,可以看我的这篇文章 概念 GroupBy,顾名思义,它是对集合中某个或者某几个字段进行分组,按着这个分组字段(这里叫key)进行排列,例如,我们按着用户表中部分进行分组,结果它会把人事部门的用户信息放在一起,技术部门的用户信息放在一起,一般地,在SQL里,我们只是对它们进行简单的聚集计算,如按着部门进行人员数量上的…
为何要写 之所以写这篇文章,完全是因为学生们在实际开发中遇到的问题,一个对象占用的内存空间总不被释放,导致系统内存不断攀升,其最主要原因是我们对“对象的生与死”不清楚,或者从来没有认真去考虑过这件事,确实一个对象在被声音,初始化,使用或者最后被系统回收,整个的过程与我们关系确实不大,我们开发人员直接用就行了,对于C#这种托管语言你没必要去自己回收它,但有时,我们多了解一点系统的回收机制,对我们的程序还是很有好处的. 对象的种类(根据作用域) 1 类对象,静态对象,使用static修饰符进行声明,…
回到目录 对于Emit我们知道它的可以动态构建程序集,类型,方法,属性等,或者说只要手动使用C#创建的东西使用Emit也都可以动态创建它们,Emit由于它的特别之处,所以在很多领域得到了广泛的应用,像最近比较火的AOP技术,它最核心的功能就是方法拦截了,我们使用Emit也是可以实现方法拦截功能的,详细可以看大叔这篇文章<Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP>. 有参数,没有返回值的方法构建与调用 [TestMethod] public voi…
回到目录 LazyInitializer.EnsureInitialized是frameworks4.0引入的新东西,实现对属性延时初始化的功能,它作用在System.Threading命名空间下,所以,它与多线程有着密切的关系,即当多人同步使用这个方法时,对存储的对象有着某种作用,这是msdn的相关说明: 这个方法可以用于多个执行者初始化Target目录对象. 在多个执行者同时存取这个方法的情况下,可能会建立多个T执行个体,但只有一个执行个体会存储至target.在些类情况下,这个方法将不会放…
回到目录 看似不伦不类 这个题目有点不伦不类,或者说有点伪模式了,不错,确实是这样,我们正确的开发思维是WEB层->BLL层->DATA层,每个层有对它下层的引用,下层不能引用上层,因为这会出现相互引用的错误,在实际工作中,BLL层会有涉及到各个业务的代码组织,实现数据持久化一般在Data层完成,这是可以理解的,也是我们经常使用的开发模式,这当然不是今天的重点,今天主要说一个实际问题,如订单处理的场合. 一般订单处理流程如下: 1 用户选择商品到购物车 2 用户确定购买,生成订单 3 选择一种…
回到目录 IDispose模式在C++中用的很多,用来清理资源,而在C#里,资源分为托管和非托管两种,托管资源是由C#的CLR帮助我们清理的,它是通过调用对象的析构函数完成的对象释放工作,而对于非托管系统来说,则需要我们自己来释放,例如数据库连接对象,这就需要我们手动去调用它的Dispose()方法来实现对象它的释放,事实上,Dispose()内容到底做了什么事,我们并不清楚,当然这就是面向对象,它不希望你关系实现的细节,呵! 对于我们开发人员来说,在了解它怎么用之后,总会对它如何实现的产生兴趣…
回到目录 AutoMapper各位一定不会陌生,大叔之前的文章中也提到过,曾经也写过扩展方法,以方便程序开发人员去使用它,而在最近,大叔在一个API项目里,在一个POST请求由DTO对象为实体对象赋值时,出现了一个问题,使用大叔不得不对原有扩展方法再进行二次的补充. 事情是这样的,有一个DTO对象RequestUserInfo和一个数据库实体对象UserInfo,在进行POST时,将RequestUserInfo对象的值需要赋给UserInfo对象,我们知道DTO对象是根据接口要求从UserIn…
回到目录 字典对象Dictionary<K,V>我们经常会用到,而在大数据环境下,字典使用不当可能引起性能问题,严重的可能引起内在的溢出! 字典的值建议为简单类型,反正使用Tuple<T> 字典的键在查找时,时间复杂度为O(1),性能不会有任何问题,所以不要愿望它 下面代码是对500万的字典进行测试,首先赋值,然后取出一个随机机,性能在毫秒级 static void Draw() { ; Console.WriteLine("test:{0} feeds", c…
回到目录 Invoke和BeginInvoke都是调用委托实体的方法,前者是同步调用,即它运行在主线程上,当Invode处理时间长时,会出现阻塞的情况,而BeginInvod是异步操作,它会从新开启一个线程,所以不会租塞主线程,在使用BeginInvoke时,如果希望等待执行的结果 ,可以使用EndInvoke来实现,这在.net framework4.5之后,被封装成了async+await来实现,代码更简洁,更容易理解. delegate void test(); static void M…
对于小型项目来说,配置信息可以通过appSettings进行配置,而如果配置信息太多,appSettings显得有些乱,而且在开发人员调用时,也不够友好,节点名称很容易写错,这时,我们有几种解决方案 1 自己开发一个配置信息持久化类,用来管理配置信息,并提供面向对象的支持 2 使用.net自带的configSections,将配置信息分块管理,并提供实体类,便于开发人员友好的去使用它 本文主要说说第二种方案,它由实体类,实体类工厂及配置文件三个部分,看代码: 实体类设计: namespace C…
对于BouncyCastle类库(包)来说,他提供了很多加密算法,在与.net和java进行相互加解密过程中,得到了不错的应用,本文以DES3为例,来说一下DES3加解密的过程. 加密过程 明文字符转为byte数组 对密钥进行处理,处理后一般为16或者24字节 对明文进行DES3加密,生成密文的byte数组 对密文byte数组进行base64的编码 解密过程 对密文byte数组进行base64的解码 对密钥进行处理,处理后一般为16或者24字节 对解码后的byte数组进行DES3解密 对解密之后…
1.Lock 只能对引用对象加锁 Lock锁定区间内可以对锁定值修改而不发生运行时错误,通常也会采用此种修改方式.这种方式又有点类同于使用Monitor.Wait取得资源,并对这个资源进行操作. 用法: private static readonly object locktask= new object(); pulick void lock() { lock(locktask) { dosomething(); } } 2.Monitor 可以对值类型加锁,实际上是在调用Monitor.En…
lock和Monitor的区别 一.lock的底层本身是Monitor来实现的,所以Monitor可以实现lock的所有功能. 二.Monitor有TryEnter的功能,可以防止出现死锁的问题,lock没有. Mutex和其他两者的区别 个人测试三个都是在限制线程之外的互斥,线程之内,都不限制,同一个线程如果被lock两次.是不会出现死锁的.所以Mutex本身可以实现lock和Monitor所有的操作.至少从功能上讲是这样的. 但是Mutex是内核级别的,消耗较大的资源,不适合频繁的操作,会降…
Lock Monitor   多线程操作的时候,为防止死锁,我们经常采用加Lock的方式解决,下面就谈一下Lock的具体运用和Lock可以用什么来替换 首先,看代码: private static object syncroot = new object(); public static void Gets() { lock(syncroot) { Console.WriteLine("sbzgw"); Console.Read(); } } 上段代码中,是Lock的典型应用 但是,在…
Monitor对象 1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit()). 2.Monitor的常用属性和方法: Enter(Object) 在指定对象上获取排他锁. Exit(Object) 释放指定对象上的排他锁. IsEnte…
“线程同步”的含义   当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行“线程同步(thread synchronization)”. 线程同步的道理虽然简单,但却是给多线程开发带来复杂性的根源之一.当线程同步不好时,有可能会出现一种特殊的情形——死锁(Dead Lock). “死锁”的含义   死锁表示系统进入了一个僵化状态,所有线程都没有执行完毕,但却谁也没法继续执行.究其根源,是因为“进程推进顺序不当”…
1,Lock lock 原型 lock 编写实例 2,Monitor 怎么用呢 解释一下 示例 设置获取锁的时效 C# 中,可以使用 lock 关键字和 Monitor 类来解决多线程锁定资源和死锁的问题. 官方解释:lock 语句获取给定对象的互斥 lock,执行语句块,然后释放 lock. 下面我们将来探究 lock 关键字和 Monitor 类的使用. 1,Lock lock 用于读一个引用类型进行加锁,同一时刻内只有一个线程能够访问此对象.lock 是语法糖,是通过 Monitor 来实…
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; namespace MyConsole.ThreadDemo { class Lock { static int Storeage { get; set; } static object LockObject = new object(); static void…
在多线程代码中,多个线程可能会访问一些公共的资源(变量.方法逻辑等等),这些公共资源称为临界区(共享区):临界区的资源是不安全,所以需要通过线程同步对多个访问临界区的线程进行控制. 同样,有些时候我们需要多个线程按照特定的顺序执行,这时候,我们也需要进行线程同步. 下面,我们就看看C#中通过lock和Monitor进行线程同步. lock关键字 lock是一种非常简单而且经常使用的线程同步方式,lock 关键字将语句块标记为临界区. lock 确保当一个线程位于代码的临界区时,另一个线程不能进入…
什么是队列? 队列Queues,是一种遵循先进先出的原则的集合,在.netCore中微软给我们提供了很多个类,就目前本人所知的有三种,分别是标题提到的:Queue.ConcurrentQueue.BlockingCollection,下面分别介绍一下. 我想学习过数据结构应该很清楚,如果没有仔细了解,只要记住队列是一个先进先出的列表即可,列表中可以是线程,可以是预备执行的函数的入口,可以是地址,可以是数据,在C#中,Queue<T> 类可以实现队列,这一个类可以简单的让我们完成数据的插入和获取…
从Java5之后,在Java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock. 1.Lock 首先要说明的就是Lock,通过查看Lock的源码可知,Lock是一个接口: 1 2 3 4 5 6 7 8 public interface Lock {     void lock();     void lockInterruptibly() throws InterruptedException;     boolean tryLock();    …
jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jquery筛选方法 一丶什么是JQuery JQuery: ​      JQuery是js的一个库,高度封装了js常用的功能,提供简便方法,调用简单,提高开发效率       js库是包含了把复杂的功能封装到简单的方法中 JQuery的两大特性: ​      链式编程:可以.的形式实现多个功能 ​…
Lock 和 synchronized 的区别 Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现: synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生:而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁: Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程…
ReentrantLock ReentrantLock(轻量级锁)也可以叫对象锁,可重入锁,互斥锁.synchronized重量级锁,JDK前期的版本lock比synchronized更快,在JDK1.5之后synchronized引入了偏向锁,轻量级锁和重量级锁.以致两种锁性能旗鼓相当,看个人喜欢,本文主要介绍一下lock和tryLock的区别. Lock VS  TryLock public void lock() { sync.lock(); } public void lockInter…