随笔分类 - C#
摘要:本文将涉及如下内容Wait HandlesEventWaitHandleSeamphoresMutex Critical Sections Miscellaneous Objects这篇文章重点说明多个不同的线程之间的同步问题。WaitHandles首先,我们必须认识到,当你尝试着理解怎么才能使多个线程在一起协调地很好,最关键的问题是怎样排序这些操作。例如,我们有如下的这些问题:1、 我们需要创建一个订单2、 我们需要保存订单,但是除非我们获得了订单号,否则我们无法进行保存操作3、 我们需要打印订单,但也仅在其被保存到数据库时打印一次看起来,这些都是非常简单的任务,甚至根本不需要使用到线程。但
阅读全文
摘要:线程的生命周期下面的图片展示了大部分线程的通常状态,以及当一个线程从某种状态切换成另一种状态时发生的某些动作:这里有一个关于线程状态的列表:状态描述Running线程已经被启动,并且没有被阻塞,没有挂起的ThreadAbortException.StopRequested线程正在请求停止,该状态只供内部使用。SuspendRequested现在正在请求暂停。Background线程将被作为后台线程执行,而不是前台线程。该状态是通过设置Thread.IsBackground属性控制的。UnstartedThread.Start方法还没有在线程上被调用Stopped线程已经停止。WaitSleep
阅读全文
摘要:本篇涉及话题:什么是进程时间片多线程的进程线程本地存储(TLS)中断线程睡眠和时钟中断线程退出/完成什么是AppDomain为什么你应该使用AppDomain给AppDomain设置数据NUnit与AppDomain线程优先级启动线程回调回顾与展望-------------------------------------------------------------------------------------------------------------------------------------------------------------------什么是进程当一个用户开启一
阅读全文
摘要:分布式命令模式是一种用来解决架构设计的建议模式。相比设计通常的应用而言,在互联系统中应该更多地考虑使用它。这种模式的目标是让独立系统与互联系统都有相同的设计。这种模式允许开发者将精力集中在设计一个遵循命令模式的通常的应用上,而不需要考虑该应用将与其他的系统相连。这种模式在设计命令时将开发者从考虑传输和通信协议中解放出来,并且能保持系统的简洁性。当某些命令被执行时,设计者不需要担心怎样发送必要的数据给服务器,以及怎样处理从服务器接收到的数据然后反应到互联应用的UI上。当一条命令在一个本地运行系统上被执行,分布式命令模式会考虑在所有的互联系统上同时执行相同命令的障碍,来让它们保持相同的状态。从一个
阅读全文
摘要:简介如果你很熟悉面向方面编程(AOP),你就会知道给代码增加“切面”可以使代码更清晰并且具有可维护性。但是AOP通常都依赖于第三方类库或者硬编码的.net特性来工作。虽然这些实现方式的好处大于它们的复杂程度,但是我仍然在寻找一种实现AOP的更为简单的方式,来试我的代码更为清晰。我将它们单独移出来,并命名为AspectF。Aspect Oriented Programming (AOP)的背景“切面”指的是那些在你写的代码中在项目的不同部分且有相同共性的东西。它可能是你代码中处理异常、记录方法调用、时间处理、重新执行一些方法等等的一些特殊方式。如果你没有使用任何面向切面编程的类库来做这些事情,那
阅读全文
摘要:.net的通用Dictionary集合类有一个“键”唯一约束。考虑这样一种情况:你想在Dictionary中存Author Name以及Articles。首先,你想加入Bob->Article_Good_One,而当你想加入Bob->Article_Good_Second,你将得到一个异常。这是因为Dictionary的唯一键约束。Dictionary拒绝接受相同的key,因为它要求键唯一。Dictionary类被设计成对搜索具有很高的性能。而多映射类在你想让搜索具有很高的性能以及让它可以为一个相同的键增加多个值的时候可以使用。背景Dictionary通用集合是一个很好的数据结构。
阅读全文
摘要:PDFKit.NET 2.0 是一个百分百的.net组件,用来创建以及操作PDF文档。这篇文章我将专注于它的“数字签名”功能。数字签名可以被用来认证PDF的源文件(谁签名过它)并且提供一个PDF文档的完整性(看文档在被签名过后被是否更改过)。我将展示怎样使用一个或多个数字签名技术以及怎样验证数字签名。内容签名更新验证签名请看下面这个表单:图片1:带有字段的PDF表单以及两个空的签名字段这个表单的字段中分为两段。一段是学生信息,一段是老师信息。通常,首先由学生填写他的部分,并且签名该文档。下面的程序可以完成这个功能:在执行上面的代码后,在PDF Reader中打开文档,看起来如下图所示:图片2:
阅读全文
摘要:在《Java编程思想》中花了一章的篇幅介绍,内部类的相关特性。而在C#的书籍中很少有提交内部类的介绍。这篇文章,就简要介绍一下,C#中的内部类。我们新建一个测试类文件,定义一个类:OuterClass。在其内部定义一个类:InnerClass1(暂且将其访问级别设置为public)。来做几个简单测试,截图如下:以上在InnerClass1中试图访问outerClass的实例变量失败!内部类访问外部类的实例方法同样失败!外部类也无法索引到内部类的实例变量(同样外部类也无法调用内部类的任何实例方法,即使方法是公有方法)。这在预料之中:不管innerClass1定义在外部还是在OutClass内部,
阅读全文
摘要:有时,我们在开发的时候,会遇到一些关于日志记录的功能。并且,它们可能是独立于系统业务逻辑的,那么我们就可以将日志做成组件的形式,以方便复用。以下采用工厂方法模式,来实现日志组件的设计,并保证对功能的扩展不会改变已有的实现。我们实现三种日志记录类型:错误日志记录、按钮点击日志记录、操作日志记录。首先,我们创建一个“抽象工厂”【其实是各实例工厂都必须实现的Log接口】,既然是日志记录,那么就需要有日志的实体了。也就是LogEntity,它是一个“抽象实体”,因为不同类型的日志,需要不同的日志实体,所以这里采用LogEntity作为抽象实体,来派生出各具体类型的日志实体。实现如下:public in
阅读全文
摘要:这是一道面试题:参考网上3种方法,C#实现:方法一:#region 方法一 //存放1-100个数 int[] num = new int[100]; //indexNum[0]=1;...indexNum[99]=100;(不重复) for (int i = 0; i < num.Length; i++) { num[i] = i + 1; } Random r = new Random(); ...
阅读全文
摘要:如果你还不是很了解CPS是什么,那么推荐几个链接给你(希望你的英语要给力啊):http://blogs.msdn.com/b/wesdyer/archive/2007/12/22/continuation-passing-style.aspxhttp://en.wikipedia.org/wiki/Continuation-passing_stylehttp://blogs.msdn.com/b/ericlippert/archive/2010/10/22/continuation-passing-style-revisited-part-two-handwaving-about-contro
阅读全文
摘要:1. 简介本规范为一套编写高效可靠的 C# 代码的标准、约定和指南。它以安全可靠的软件工程原则为基础,使代码易于理解、维护和增强,提高生产效率。同时,将带来更大的一致性,使软件开发团队的效率明显提高。2. 适用范围本规范适用于公司所有的C#源代码,为详细设计,代码编写和代码审核提供参考和依据。3. 文体本规范中的建议分为四种:要,建议,避免,不要,表示需要遵循的级别。文档中会以粗体表示。对于应遵循的规范,前面会以“Ö”来表示,对不好的做法前面会以“´”来表示:要:描述必须遵循的规范。例如:Ö 异常类要以“Exception”做为后缀;建议:描述在一般情况下应该遵循
阅读全文
摘要:对非托管资源的隐式控制是由析构方法提供的,它会在对象销毁时由垃圾回收器调用。析构方法应该只释放对象占用的资源,而不应该引用其他对象。请注意,如果只有托管引用,就无需也不应该实现析构方法,它只适用于处理非托管资源。因为析构方法需要一定的开销,应该在需要它的方法中才实现。不能直接调用对象的析构方法,垃圾回收器会为我们调用的。****析构方法的工作原理*****垃圾回收器会维护一个含有析构方法的对象列表。此列表在每次创建或销毁这种对象时都会更新。当这一列表中的对象首次被回收时,它会被放到一个队列中与其他被放在队列中的其他对象一起等待销毁。在析构方法执行之后,垃圾回收器会回收对象,并更新队列及可销毁列
阅读全文
摘要:知识储备,如果您已经十分熟习这些,可以跳过 1 什么是引用?引用是一个数据结构,包含了一个计算机内存堆地址的值,就类似C++中的指针一样,本文中所有出现有关"引用"字句,读者都可以把它理解成C,C++中的指针 再说一遍,引用 与 指针 是不同的,例如 GC在回收内存的时候,会修改引用的值,但本文的重点并不是讲述 引用 与 指针的差别,所以,读者可以把所有在这里出现的 "引用" 理解成 c,c++ 中的指针2 栈 与 堆, .net中的内存分配? http://blog.csdn.net/cuike519/archive/2009/12/23/506333
阅读全文
摘要:一个简单的泛型示例:定义:class Stack<T> { private T[] store; private int size; public Stack() {store = new T[10]; size = 0; } public void Push(T x) { store[size++] = x; } public T Pop() { return store[--size]; }}调用:Stack<int> x = new Stack<int>(); //类型初始化,并产生一个泛型实例;x.Push(17);泛型:通过参数化类型来实现在同一份
阅读全文