C# 异步编程 异步委托调用同步方法

同步化操作:

由前后紧接的组件或函数调用组成。一个同步化调用会阻塞整个进程直到这一个操作完成。

C# 异步编程 异步委托调用同步方法

异步化操作:

不会阻塞启动操作的调用线程。调用程序必须通过轮流检测、软件中的中断信号或只是明确地等待完成信号来发现调用的完成。

C# 异步编程 异步委托调用同步方法

.NET 为异步操作提供两种设计模式:

· 使用 IAsyncResult 对象的异步操作。

· 使用事件的异步操作。

.NET的许多方面都支持异步编程功能,这些方面包括:

· 文件 IO、流 IO、套接字 IO。

· 网络。

· 远程处理信道(HTTP、TCP)和代理。

· 使用 ASP.NET 创建的 XML Web services。

· ASP.NET Web 窗体。

· 使用 MessageQueue 类的消息队列。

 

 

异步委托提供以异步方式调用同步方法的能力。

• 当同步调用一个委托时,调用方法直接对当前线程调用目标方法。如果编译器支持异步委托,则它将生成该调用方法以及BeginInvoke 和EndInvoke 方法。

• 如果调用BeginInvoke 方法,则公共语言运行库将对请求进行排队并立即返回到调用方。将对来自线程池的线程调用该目标方法。提交请求的原始线程自由地继续与目标方法并行执行,该目标方法是对线程池线程运行的

• 在回调中,使用EndInvoke 方法来获取返回值和输入/输出参数。如果没有对BeginInvoke 指定回调,则可以在提交请求的原始线程上使用EndInvoke。

 

  
    
1 using System;
2   using System.Threading;
3   using System.Runtime.Remoting.Messaging;
4
5   namespace ClassMain
6 {
7 // 委托声明(函数签名)
8   delegate string MyMethodDelegate();
9
10 class MyClass
11 {
12 // 要调用的动态方法
13 public string MyMethod1()
14 {
15 return " Hello Word1 " ;
16 }
17
18 // 要调用的静态方法
19 public static string MyMethod2()
20 {
21 return " Hello Word2 " ;
22 }
23 }
24 class Class1
25 {
26 /// <summary>
27 /// 应用程序的主入口点。
28 /// </summary>
29 [STAThread]
30 static void Main( string [] args)
31 {
32 MyClass myClass = new MyClass();
33
34 // 方式1: 声明委托,调用MyMethod1
35 MyMethodDelegate d = new MyMethodDelegate(myClass.MyMethod1);
36 string strEnd = d();
37 Console.WriteLine(strEnd);
38
39 // 方式2: 声明委托,调用MyMethod2 (使用AsyncResult对象调用)
40 d = new MyMethodDelegate(MyClass.MyMethod2); // 定义一个委托可以供多个方法使用
41 AsyncResult myResult; // 此类封闭异步委托异步调用的结果,通过AsyncResult得到结果.
42 myResult = (AsyncResult)d.BeginInvoke( null , null ); // 开始调用
43
44 while ( ! myResult.IsCompleted) // 判断线程是否执行完成
45 {
46 Console.WriteLine( " 正在异步执行MyMethod2 ..... " );
47 }
48 Console.WriteLine( " 方法MyMethod2执行完成! " );
49 strEnd = d.EndInvoke(myResult); // 等待委托调用的方法完成,并返回结果
50 Console.WriteLine(strEnd);
51 Console.Read();
52 }
53 }
54 }
55
56

 

 

 

你可能感兴趣的:(C#)