zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    LayoutInflater(布局服务)
    FOTA升级
    APK安装过程及原理详解
    Context类型
    Android应用的persistent属性
    Notification(状态栏通知)详解
    Handler消息传递机制浅析
    Selenium HTMLTestRunner 无法生成测试报告的总结
    【python】远程使用rsa登录sftp,上传下载文件
    02.性能测试中的指标
  • 原文地址:https://www.cnblogs.com/luoht/p/1780270.html
Copyright © 2011-2022 走看看