雁过请留痕...
代码改变世界

随笔分类 -  C#

研究BackgroundWorker后发现:AsyncOperation和SynchronizationContext的差异真的很大!

2012-08-22 15:58 by xiashengwang, 1610 阅读, 收藏, 编辑
摘要: 今天研究BackgroundWorker代码时发现,两处代码的写法有些不一致,于是好奇的测试了一番,以为能测出BackgroundWorker的一个bug。结果大家都知道microsoft胜了。下面来看看过程,BackgroundWorker类里的ReportProgress方法public void ReportProgress(int percentProgress, object userState){if (!this.WorkerReportsProgress) throw new InvalidOperationException("BackgroundWorker_Wo 阅读全文

APM异步编程模型的优势

2012-08-21 14:11 by xiashengwang, 1271 阅读, 收藏, 编辑
摘要: 我们之所以要花大力气学习APM,就必须要清楚它能解决实际编程中的那些难题。以及现有的技术为什么不行。简单点说:APM是基于IAsyncResult接口的,采用的BeginXXX和EndXXX的形式来实现异步。下面这几点就是APM的优势:1,线程执行是异步的,不会阻塞调用线程。这一点也是我们使用异步的主要目的,我们不就是希望后台处理一些耗时操作吗?2,任务完成可以得到通知。(非阻塞)3,任务可以实现进度报告。(需要额外的辅助代码支持)4,可以有返回值。5,参数可以是多个。再看看Thread,ThreadPool,Task能实现上面的几点?这三个中,Task是相对完善的一个,对于第2点它可以通过C 阅读全文

线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource

2012-08-18 16:39 by xiashengwang, 2454 阅读, 收藏, 编辑
摘要: 不管我们使用thread,threadPool,task,还是APM异步,本质都是在使用多线程。对于新手来说,不太敢用多线程的原因,就我个人的体验来说,就是对多线程的异常捕获方式或时机缺乏了解,而一旦出现异常没有捕获,将会带来难以发现的bug,进而造成系统崩溃。而多线程本身也不是一朝一夕就能学好的,必须不断的去学习总结,所以我个人认为你要用一种线程模型,首先要对它有足够的了解,特别是对异常的捕获。如果你没有完全的把握,最好在实际开发中谨慎的用多线程。1,APM异步编程模型。采用BeginXXX和EndXXX方法。关于异常的捕捉,对于刚调用BeginXXX抛出的异常,异步操作可能还没有进入队列。 阅读全文

非UI线程更新UI界面的各种方法小结

2012-08-18 15:58 by xiashengwang, 5500 阅读, 收藏, 编辑
摘要: 我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的。但是我们在进行异步操作时,经常需要将异步执行的进度报告给用户,让用户知道任务的进度,不至于让用户误认为程序“死掉了”,特别是对于Winform,WPF等客户端程序尤为重要。 那么我们要探讨的就是如何让非UI的任务线程更新UI界 阅读全文

一个关于字典查找引发的思考——BinarySearch

2012-08-02 12:20 by xiashengwang, 1978 阅读, 收藏, 编辑
摘要: 最近在一个e文网站的提问区看到一个非常有意思的问题,内容如下:有几组信号范围(range),每个范围对应一个位置(Position):Signal Strenth Position0-9 110-19 220-29 3要求很简单,就是比如输入一个15,找到它的Position为2。但要求不能用IF语句进行简单的判定,最好用类似于字典的查找。看见这个问题,你脑海中有什么样的方案?Dictionary?在实际工作中还是经... 阅读全文

C# 3.0 新特性概览

2012-07-23 22:33 by xiashengwang, 599 阅读, 收藏, 编辑
摘要: 1. 隐式类型局部变量(Implicitly Typed Local Variables)隐式类型局部变量的具体类型取决于初始化它的表达式。在一个局部变量声明时,前面加一个var关键字,这个局部变量就被叫做隐式类型局部变量。例如: var i = 0; var s = "Hello"; var d = 1.0; var numbers = new int[] { 2, 4, 7, 8 }; var order = new Dictionary<string, string>();上... 阅读全文

log4net使用总结

2012-06-20 17:08 by xiashengwang, 862 阅读, 收藏, 编辑
摘要: 一,log4net是什么 log4net架构下用于记录日志的开源组件,功能相当完善,免去了我们重复造轮子。我想不管是winform还是web都需要记录日志。 官网下载地址:http://logging.apache.org/log4net/ SDK地址:http://logging.apache.o 阅读全文

通用的泛型Icomparer生成类,对类进行排序,最大支持4个字段同时比较

2012-06-07 15:18 by xiashengwang, 340 阅读, 收藏, 编辑
摘要: 一,通常我们自己定义一个类,然后对类的集合进行排序,是下面这样的做法 class People { public int ID { get; set; } public string Name { get; set; } public DateTime Birthday { get; set; } public override string ToString() { return string.Format("{0},{1},... 阅读全文

扩展方法及几种常见的代理(delegate)语法

2012-06-05 11:27 by xiashengwang, 381 阅读, 收藏, 编辑
摘要: 1,扩展方法必须写在非泛型的静态类中using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;namespace Cshapr3._0NewFeature{ public static class ExtendMethod { //Search Control's Child public static IEnumerable<T> SearchControls<T>(this Control c... 阅读全文

Excel单元格列名转化成函数

2012-03-20 21:17 by xiashengwang, 554 阅读, 收藏, 编辑
摘要: /// <summary> /// Excel形式的列变换 /// </summary> public class ExcelCRHelper { private const string ALPHABET_UPPER = "ABCDEFGHIGKLMNOPQRSTUVWXYZ"; /// <summary> /// 形如(B4)的单元格的列号提取 /// </summary> /// <returns></returns> public static int ExtractCol... 阅读全文

c#实现的破解程序--针对软件使用时间限制

2011-12-22 22:09 by xiashengwang, 3582 阅读, 收藏, 编辑
摘要: 自己捣腾了一天,弄了一个修改软件过期的小程序,主要是自己有几款有时间限制的软件,每次改时间很麻烦。有了这个程序就可以一劳永逸了。前提:只适用于修改操作系统时间后,程序就能够正常使用的那种软件。如Lingoes,reflector,这两款我测试是可以的。在Win7下必需用管理员的方式启动。思路很简单:1,修改操作系统时间到软件过期前。2,启动软件。3,改回操作系统时间。程序类似于网上的一款好像叫RunAsDate的软件,没用过,只大概记得它的界面,决定自己实现类似的功能。该程序的亮点是1,可以生成破解程序的快捷方式到桌面上,生成的快捷方式图标和原来的程序一样(有轻度的失真),生成这个快捷方式后, 阅读全文

c#修改系统时间的方法

2011-12-21 17:06 by xiashengwang, 5379 阅读, 收藏, 编辑
摘要: C#没有提供直接的方法对系统时间进行设定,一般我们只能通过DateTime.Now获取系统时间,但是并不能对这个时间进行修改。这里对了解的主要的两种方式做了个整理,希望对大家有帮助。方法一,用API函数的方式来修改时间。首先定义API函数 [StructLayout( LayoutKind.Sequential)] public struct SYSTEMTIME { public ushort wYear; public ushort wMonth; public ushort wDayOfWeek; public u... 阅读全文

浅拷贝和深拷贝

2011-12-21 15:48 by xiashengwang, 342 阅读, 收藏, 编辑
摘要: 关于深拷贝和浅拷贝的区别,主要在对于引用类型的成员的拷贝上,浅拷贝只是简单的复制引用的地址,深拷贝会生成一个完全独立的对象,包括对象内的引用成员。浅拷贝:Object类提供了一个MemberwiseClone方法,一般是基于它来实现。深拷贝:要求对象要实现Serializable特性,表明它是可以被序列化的。利用对象的序列化和反序列化来实现深度拷贝。完整的例子如下:using System;using System.Collections.Generic;using System.Text;namespace CsharpBase{ class CloneDemo { ... 阅读全文

IEnumerable接口使用

2011-12-21 15:04 by xiashengwang, 242 阅读, 收藏, 编辑
摘要: 要使用foreach语句对对象遍历,对象必须实现IEnumerable接口,下面是一个Demo。using System;using System.Collections.Generic;using System.Collections;using System.Text;namespace CsharpBase{ class EnumerableDemo { public static void Run() { Child[] childs = new Child[3] { new ... 阅读全文

Winform下KeyDown,KeyPress,KeyUp事件的总结

2011-09-15 13:26 by xiashengwang, 4945 阅读, 收藏, 编辑
摘要: 在winform程序中,经常会用到这几个事件用于控制数字输入,按键动作等操作,但一直没有完全弄清楚他们之间的区别和联系,到底什么时候用哪一个事件合适,闲暇无事,做了一个小小的总结,以免以后犯糊涂。1) 这三个事件调用的先后顺序(MSDN) 1.KeyDown :在控件有焦点的情况下按下键时发生 2. KeyPress :在控件有焦点的情况下按下键时发生。 3. KeyUp :在控件有焦点的情况下释放键时发生。2) KeyDown和KeyPress在MSDN上的解释完全一样,都是在按下键的时候发生,那区别是什么呢?textBox1_KeyDown(object sender, KeyEventA 阅读全文

C#前期绑定和后期绑定操作Excel-------实现简单打印功能

2011-09-06 14:00 by xiashengwang, 631 阅读, 收藏, 编辑
摘要: 1,前期绑定前期绑定需要引用Microsoft.Office.Interop.Excel.dll,代码有提示功能,编写方便,且代码量小。但是和具体的office版本密切相关,不同版本的Excel可能会出现不兼容。using System;using System.Collections.Generic;using System.Text;using Excel = Microsoft.Office.Interop.Excel;namespace ExcelCsharpTest{ class ExcelPrintNomal { public void PrintOut(... 阅读全文

实现List的多列排序

2011-05-20 12:15 by xiashengwang, 655 阅读, 收藏, 编辑
摘要: List的sort()方法,只能实现简单数据的排序,如过List里面装的是对象,就必须要显示实现IComparer接口,才能排序,并且有时我们需要对一个对象进行多列排序,如学生按学号,成绩升序排列。在实现这个接口的时候,我们可以对多个字段排序,代码如下: public class People { public string Sex { get; set; } public int Age { get; set; } public string Name { get; set; } }... 阅读全文