吴佳鑫的个人专栏

当日事当日毕,没有任何借口

导航

上一页 1 ··· 5 6 7 8 9 10 11 12 13 ··· 18 下一页

2012年2月1日

异步编程模式(六):基于事件的异步调用模式

摘要: 前一个日记介绍了以 WebResponse 为代表的支持IAsyncResult 异步调用模式的组件,.NET基类库中有部分组件实现 了另一种异步模式,这就是"基于事件的异步模式(EAP模式)"。实现 了EAP模式的最典型组件是WebClient。WebClient定义了以下两个同步方法用于从WEB上下载文件:public void DownloadFile(string address, string fileName);public void DownloadFile(Uri address, string fileName);为了实现异步调用,WebClient又定义 阅读全文

posted @ 2012-02-01 15:06 _eagle 阅读(2423) 评论(1) 推荐(3) 编辑

异步编程模式(五):实现 IAsyncResult 异步调用模式的组件

摘要: 在.net 基类型库中,有一些现有的组件直接实现了 IAsyncResult 异步调用设计模式,这些组件通常同时提供某个方法的同步与异步调用形式。以system.net 命名空间中的 WebRequest 为例,如上图所示:有以下规律。1.凡有一个 "BeginXXX"的,一定有一个"EndXXX"方法相对应。2.每组"BeginXXX / EndXXX",一定有一个对应的 "XXX"方法。3."EndXXX" 方法与对应的同步方法 "XXX"的返回值类型相同。注意一下&qu 阅读全文

posted @ 2012-02-01 13:52 _eagle 阅读(594) 评论(0) 推荐(0) 编辑

2012年1月19日

异步编程模式(四):异步调用中的异常与任务同步

摘要: 在上一示例中,如果用户输入了一个不存在的文件夹,会直接抛异常,那么在异步中,如果出现异常了,是什么机制来处理的呢。由于发生异常的代码与调用代码位于同一个线程中,因此当异常发生时,计算机会中当前线程的执行流程,转去执行异常处理代码。如果异常是在异步调用的过程中抛出的,调用者线程与执行异步调用 的线程不是同一个,那又该怎样处理?1、当一个异步调用的方法抛出一个异常,CLR会捕获它,当启动异步调用的线程(称为调用者线程)调用 EndInvoke 方法等待异步调用线束时,CLR会将此异常再次抛出,这样,调用者线程即可捕获它。2、如果在调用BeginInvoke 方法启动异步调用时提供了一个回调方法,则 阅读全文

posted @ 2012-01-19 20:02 _eagle 阅读(838) 评论(0) 推荐(0) 编辑

异步编程模式(三):等待异步调用的完成

摘要: 当程序启动一个异步调用之后,调用者线程必须有一种方法能知道此调用的执行情况,并且在这一调用执行完毕之后,取回执行结果。可以有以下二种方法:一、使用轮询现在我们来改造上一节的示例程序。我们可以在程序执行异步调用的过程中,让计算机每隔一段时间向控制台输出一个小点,告诉用户搜索工作正在进行中,从而可以大大改善程序的用户友好性。示例程序:namespace AsyncCalculateFolderSize2{ class Program { //计算指定文件夹的总容量 private static long CalculateFolderSize(string ... 阅读全文

posted @ 2012-01-19 19:50 _eagle 阅读(4044) 评论(0) 推荐(0) 编辑

异步编程模式(二):基于委托的异步编程模式

摘要: 上一节日记中,项目所展示的异步编程模式到底是怎么实现的?上一节代码中定义了一个委托:public delegate long CalculateFolderSizeDelegate(string FolderName);经过编译器,在编译上述委托语句时,会自动产生以下的类模板:public sealed class CalculateFolderSizeDelegate: System.MulticastDelegate{ public CalculateFolderSizeDelegate(Object target , int methodPtr){.......} publi... 阅读全文

posted @ 2012-01-19 17:22 _eagle 阅读(543) 评论(0) 推荐(0) 编辑

异步编程模式(一)

摘要: .net 的异步编程技术主要分为两个块:1、使用IAsyncResult 的异步编程模式。2、基于事件的异步编程模式。C#编译器会为每个委托生成支持异步执行的 BeginInvoke / EndInvoke 方法,从而将委托和异步编程紧密联系起来了。当同步执行程序时,如果执行到需要执行较长时间的代码时,用户必须等待,也会认为程序已经卡死或死机了。同步程序的示例代码如下:namespace CalculateFolderSizeNoAsync{ class Program { //计算指定文件夹的总容量 private static long Calcul... 阅读全文

posted @ 2012-01-19 16:47 _eagle 阅读(916) 评论(1) 推荐(1) 编辑

委托、匿名方法、Lambda表达式的演进

摘要: 假设给我们一个泛型对象List<T>,T为int类型,要求我们使用该对象方法FindAll(Predicate<T> match)从中找出该List中的偶数,您如何实现? 说明一下:Predicate<T>是一个泛型委托,它的原型为public delegate bool Predicate<T>(T obj),该委托传入一个T类型对象,经逻辑判断后返回布尔值。委托 可能您首先想到的是用委托实现,实现方法如下: // 方法1 static void Method1(){ // 创建List<int>对象 List < int & 阅读全文

posted @ 2012-01-19 15:47 _eagle 阅读(826) 评论(2) 推荐(0) 编辑

关于Predicate<T>委托

摘要: Predicate<T>委托在.NET类类库中经常出现,此委托的定义如下:public delegatebool Predicate<T>(T obj);从其定义可以看到,此委托引用一个返回bool 值的方法,在实际开发中,通常使用Predicate<T>委托变量引用一个“判断条件函数”,在判断条件函数内部书写代码表明函数参数所引用的对象应满足的条件,条件满足时,函数返回true.在类库中,List<T> 里面的 Find方法, 定义如下:public T Find(Predicate<T> match);那么我们可以在外部定义一个查 阅读全文

posted @ 2012-01-19 15:43 _eagle 阅读(19873) 评论(0) 推荐(0) 编辑

Func和Action系统委托

摘要: 为了方便开发,.net基类库针对在实际开发中最常用的情形提供了几个预定义好的委托,这些预定义委托用得很广。Func,Action 的介绍及其用法Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能。Action<T>和Func<T,TResult>的功能是一样的,只是Action<T>没有返类型,Func<T,T,Result>:有参数,有返回类型Action,则既没有返回也没有参数,Func<T 阅读全文

posted @ 2012-01-19 15:38 _eagle 阅读(4206) 评论(0) 推荐(0) 编辑

delegate详解

摘要: 我们使用delegate关键字定义一个委托数据类型时,其实是定义了一个新类,此类派生自 MulticastDelegate,而 MulticastDelegate 又派生自 Delegate.我们定义:public delegate int MathOptDelegate(int value1 , int value2);C#编译器实际上是按照以下这个 “代码模板”进行编译的:public class MathOptDelegate : System.MulticastDelegate{ public MathOptDelegate(Object target , Int32 metho... 阅读全文

posted @ 2012-01-19 15:20 _eagle 阅读(2837) 评论(1) 推荐(1) 编辑

上一页 1 ··· 5 6 7 8 9 10 11 12 13 ··· 18 下一页