摘要: 在命名空间System.Threading.Tasks下,有一个静态类Parallel简化了在同步状态下的Task的操作。Parallel主要提供了3个有用的方法:For、ForEach、Invoke。For方法,主要用于处理针对数组元素的并行操作,如下:staticvoid Main(string... 阅读全文
posted @ 2011-05-19 08:59 陆敏技 阅读(16985) 评论(11) 推荐(8)
摘要: 一:Task的优势ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:1: ThreadPool不支持线程的取消、完成、失败通知等交互性操作;2: ThreadPool不支持线程执行的先后次序;以往,如果开发者要实现上述功能,需要完成很多... 阅读全文
posted @ 2011-05-13 08:35 陆敏技 阅读(50988) 评论(40) 推荐(27)
摘要: 在C#中让线程同步的另一种编码方式就是使用线程锁。所谓线程锁,就是锁住一个资源,使得应用程序只能在此刻有一个线程访问该资源。可以用下面这句不是那么贴切的话来理解线程锁的作用:锁,就是让多线程变成单线程。在C#中,可以将被锁定的资源理解成new出来的普通对象。既然需要锁定的资源就是一个C#中的对象,我们就该仔细思考,到底什么样的对象能够成为一个锁对象(也叫同步对象)?在选择同步对象的时候,应当始终注意以下几点: q同步对象在需要同步的多个线程中是可见的、同一个对象; q非静态方法中,静态变量不应作为同步对象;q值类型对象不能作为同步对象;q避免将字符串作为同步对象。q降低同步对象的可见 阅读全文
posted @ 2011-05-09 09:14 陆敏技 阅读(7442) 评论(11) 推荐(9)
摘要: 开发者总尝试对自己的代码有更多的控制。“让那个还在工作的线程马上停止下来”就是诸多要求中的一种。然而事与愿违,这里面至少存在两个问题:第一个问题是:正如线程不能立即启动一样,线程也并不能说停就停。无论采用何种方式通知工作线程需要停止,工作线程都会忙完手头最紧要的活,然后在它觉得合适的时候退出。以最传... 阅读全文
posted @ 2011-05-08 08:26 陆敏技 阅读(39850) 评论(13) 推荐(5)
摘要: 所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定。C#中对象的类型分为引用类型和值类型。CLR在这两种类型上的等待是不一样的。我们可以简单的理解为在CLR中,值类型是不能被锁定的,也即:不能在一个值类型对象上执行等待。而在引用类型上的等待机制,则分为两类:锁定和信号同步。 锁定,使用关键字lock和类型Monitor。两者没有实质区别,前者其实是后者... 阅读全文
posted @ 2011-05-03 08:55 陆敏技 阅读(11565) 评论(22) 推荐(20)
摘要: WPF快速指导15:动画在WPF或者SilverLight中,所谓动画,就是让一个对象的属性,随着时间而发生变化。动画由时间线(timeline)控制。时间线在C#中的原型为: public abstract class Timeline : Animatable { //省略 }它是一个抽象类。在WPF中,定义了各类时间线,最常用的有DoubleAnimation,它便继承自Timeline。1:Storyboard及一个简单示例容纳时间线的是故事板(Storyboard)。下面是一个最简单的例子:前台: <Canvas x:Name="Carrier" Width 阅读全文
posted @ 2011-04-28 17:07 陆敏技 阅读(2952) 评论(3) 推荐(3)
摘要: WPF快速指导14:变换变换,也叫变形(transform)。它定义了从一个坐标空间到另一个坐标空间的映射。变换通过矩阵来描述。变换包括旋转、伸缩、倾斜、调动,这些行为都是矩阵变换。用户还可以实现自己的矩阵。各种变换通过RenderTransform属性来应用。RenderTransform是UIElement的一个公共属性,它的类型是Transform。类型Transform是一个抽象类。所以,要为元素的设置变化,就意味着要为元素的RenderTransform属性设置一个Transform的子类的一个实例对象。这话听上去有些拗口,但是下面的示例可以让大家明确这一点。1:变换之RotateT 阅读全文
posted @ 2011-04-27 15:55 陆敏技 阅读(2818) 评论(1) 推荐(3)
摘要: 前两期地址:C#高效编程话题集1(每期10话题)C#高效编程话题集2(每期10话题)本期话题:1:使用属性还是字段首先重大区别就是属性实质是方法,所以:1:可以为属性添加代码;2:可以让属性支持线程安全;见effective c#第一版的第一章;3:属性得到了VS编辑器的支持,得以实现自动属性这种功能。4:自动属性的特点在LINQ中得到了广泛应用,尤其是匿名类型中,只能实现只读的自动属性,匿名类型不支持字段;5:从设计的角度,也就是面向对象的角度,建议使用属性;6:如果某个属性仅仅作为类型内部使用,而且不涉及到上面5点内容,则建议使用字段还有一点,属性在序列化中有点尴尬,由于属性是方法,所以不 阅读全文
posted @ 2011-04-19 08:40 陆敏技 阅读(5744) 评论(15) 推荐(8)
摘要: 在标准的Dispose模式中(见前一篇博客“C#中标准Dispose模式的实现”),提到了需要及时释放资源,却并没有进一步细说让引用等于null是否有必要。有一些人认为等于null可以帮助垃圾回收机制早点发现并标识对象是垃圾。其他人则认为这没有任何帮助。是否赋值为null的问题首先在方法的内部被人提... 阅读全文
posted @ 2011-04-07 08:40 陆敏技 阅读(16528) 评论(57) 推荐(7)
摘要: 怕忘记,重新记录一下。有一种提高自己编程能力的好办法,就是看看.net framework的源码是如何写的?我们在追踪bug的时候,也往往需要追踪到.net framework的源码中去。按照如下方法设置vs2010,即可追踪到.net framwork的源代码中去。可以看出,我将pdb文件放在了d:\msSource\MicrosoftPublicSymbols目录下面,这样在调试的时候,vs会自动去该目录下面找pdb文件。 我们可以看看这个目录下的文件 调试源码后,我们会找到一些平时不怎么写的东西。比如我追踪 IEnumerable<int>的扩展方法Sum,可以看到 如下的代 阅读全文
posted @ 2011-04-02 13:40 陆敏技 阅读(4674) 评论(3) 推荐(3)
摘要: 需要明确一下C#程序(或者说.NET)中的资源。简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类:托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象;非托管资源:不受CLR管理的对象,windows内核对象,如文件、数据库连接、套接字、COM对象等;毫无例外地,如果我... 阅读全文
posted @ 2011-03-29 08:50 陆敏技 阅读(31002) 评论(40) 推荐(21)
摘要: 24、23期:http://www.microsoft.com/china/community/clubs/blogs.mspx 阅读全文
posted @ 2011-03-25 13:28 陆敏技 阅读(677) 评论(0) 推荐(0)
摘要: 第一期话题在:C#高效编程话题集1(每期10话题)C#快速成长团队第二期话题来到。欢迎进入C#快速成长团队进行讨论。1:确保集合的线程安全如果使用.net4.0,有新的线程安全集合类新的 System.Collections.Concurrent 命名空间引入了多个新的线程安全集合类,可在需要时随时提供对项的无锁访问,并在锁适用时提供细粒度锁定。 在多线程方案中使用这些类应获得优于集合类型(例如,... 阅读全文
posted @ 2011-03-25 09:36 陆敏技 阅读(6612) 评论(17) 推荐(14)
摘要: 要选择正确的集合,我们首先要了解一些数据结构的知识。所谓数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合。结合下图,我们看一下对集合的分类。 集合分类 在上图中,可以看到,集合总体上分为线性集合和非线性集合。线性集合指元素具有唯一的前驱和后驱的数据结构类型。非线性集合是指具有多个前驱或后驱的数据结构类型,如:树、图。在FCL中,非线性集合实现的比较少,所以我们将会更多的讨论线性集合。... 阅读全文
posted @ 2011-03-24 09:12 陆敏技 阅读(13822) 评论(23) 推荐(24)
摘要: 近来在小组C#快速成长团队讨论了若干话题,有些感觉不错,特总结与大家分享。当然,所谓话题,重点在于进行讨论,是否是最佳实践也属于大家的个人之见。以下观点若有差错,尽情蹂躏。1:String str1 = “str1”+ 9; 和String str2 = “str2”+ 9.ToString(); 哪个效率高可以知道“str1”+ 9,在运行时会完成一次装箱行为。9.ToString(),没有发生... 阅读全文
posted @ 2011-03-02 09:02 陆敏技 阅读(9541) 评论(32) 推荐(21)
摘要: dynamic是FrameWork4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性。比如,即使你对GetDynamicObject方法返回的对象一无所知,你也可以像如下那样进行代码的调用,编译器不会报错: dynamic dynamicObject = GetDynamicObject(); Console.WriteLine(dynamicObject.Name); Console.WriteLine(dynamicObject.SampleMethod());说到正确用法,那么首先应该指 阅读全文
posted @ 2011-02-18 09:01 陆敏技 阅读(20597) 评论(19) 推荐(15)
摘要: 迭代器模式是GOF23种模式中的一种,目的是为了提供对集合的遍历。为什么要实现迭代器模式:假设存在一个数组,我们的遍历模式可能是采用依据索引来进行遍历。又假设存在一个HashTable,我们的遍历模式就可能按照键值来进行遍历。无论是哪个集合,如果它们的遍历没有一个公共的接口,那么我们的客户端进行调用的时候,相当于是对具体类型进行了编码。这样以来,当需求变化的时候,就必须修改我们的代码。并且,由于客户端代码过多的关注了集合的内部实现,代码的可移植性就会变得很差,这直接违反了面向对象中的开闭原则。于是,迭代器模式就诞生了。现在,不要管FCL中是如何实现该模式的,我们先来实现一个我们自己的迭代器模式 阅读全文
posted @ 2011-02-17 13:47 陆敏技 阅读(4669) 评论(38) 推荐(5)
摘要: WPF快速指导13:数据绑定之集合绑定之视图(排序、过滤、分组) 本文摘要:1:为什么需要视图; 2:变更集合; 3:排序; 4:过滤筛选; 5:分组; 1:为什么需要视图 一旦 ItemsControl 绑定到数据集合,您可能希望对数据进行排序、筛选或分组。若要执行此操作,可以使用集合视图,这是实现 ICollectionView 接口的类。 集合视图是位于绑定源集合顶部的一层,您可以通过它使用排序、筛选和分组查询来导航和显示源集合,而无需更改基础源集合本身。集合视图还维护着一个指向集合中的当前项的指针。如果源集合实现了 INotifyCollectionChanged 接口,则 阅读全文
posted @ 2011-02-09 13:11 陆敏技 阅读(7339) 评论(3) 推荐(5)
摘要: 一句话:你是否真的了解new, override, virtual下面代码的结果,如果基类使用接口代替,也是一样的效果。主要注意看override或new了基类的方法后,调用方将子类对象转型为父类后的输出会有什么不同;代码 阅读全文
posted @ 2011-02-08 21:55 陆敏技 阅读(2783) 评论(2) 推荐(1)
摘要: WPF快速指导12: 线程处理模型 本文摘要: 1:理解与UI相关的多线程操作; 2:多个窗口多个线程 3:WPF中的多线程异常1:理解与UI相关的多线程操作 首先来说说传统Winform。我们知道传统Winform新起工作线程,在工作线程中不能对界面元素进行操作。如下面的代码,运行会报错“线程间操作无效: 从不是创建控件“label1”的线程访问它。”: 要使上面的代码能成功运行,我们需要使用控件的Invoke 和 BeginInvoke和方法。这两个方法的意思是说,让赋值这个行为交给UI线程去处理。代码如下: 而WPF的控件,我们找不到Invoke 和 BeginInvoke这两个方法 阅读全文
posted @ 2011-02-07 12:04 陆敏技 阅读(5533) 评论(6) 推荐(9)
Web Counter
Coupon for Contacts