zoukankan      html  css  js  c++  java
  • C# 委托异步回调 基本使用方法

    首先,先理清出一个概念:
    delegate 与Delegate有什么区别?
    Delegate:是一个抽象基类,它引用静态方法或引用类实例及该类的实例方法。然而,只有系统和编译器可以显式地从 Delegate 类派生出委托类型。
    MulticastDelegate:是一个继承于Delegate的类,其拥有一个带有链表格式的委托列表,该列表称为调用列表,在调用多路广播委托时,将按照调用列表中的委托出现的顺序来同步调用这些委托。平常我们声明一个delegate的类型,都是继承于MulticastDelegate类的(注意:不能显式地从此类进行派生。这点与Delegate类是一样的,只有系统和编译器也可以显示地进行派生)。
    delegate 是一个C#关键字,用来定义一个新的委托类型(继承自MulticastDelegate类)。

    其中IAsyncResult的 CompletedSynchronously属性不是很明白

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Runtime.Remoting.Messaging;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {          
                Func<int> Fuc = () =>
                {
                    int i = 5;
                    while (i>=0)
                    {
                        Console.WriteLine("----------"+i);
                        i--;
                        Thread.Sleep(500);
                    }
                    return 6;
                };
                ManualResetEvent  re= new ManualResetEvent(false);
                
               
                var iarOut= Fuc.BeginInvoke(
                    (iar) => {
                        //AsyncState可以得到传入参数,这里即"Test"
                        //一般也可以传入调用函数自身,可以免去转化AsyncResult来得到
                        var parm = iar.AsyncState as string;
    
                        Console.WriteLine("Pram:"+parm);
    
                        //要将传递过来的IAsyncResult的参数转化为AsyncResult
                        //才能得到原调用方法
                        AsyncResult ar = iar as AsyncResult;
                        
                        var caller = ar.AsyncDelegate as Func<int>;//得到调用方法,即Fuc
    
                        //调用EndInvoke会阻塞线程直到方法执行完毕,这里是执行完毕的回调不会阻塞
                        var returnValue = caller.EndInvoke(iar);
                        Console.WriteLine("Result:"+returnValue);
                        re.Set();
                    },
                    "Test");
    
                //等待回调方法执行完毕后才继续执行
                re.WaitOne();
    
                Console.WriteLine("----------Complete");
            }
    
        }
    
    }
  • 相关阅读:
    高通平台msm8953 Linux DTS(Device Tree Source)设备树详解之二(DTS设备树匹配过程)
    Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)
    ACPI Table 与 Device Tree
    Electron 的 安装
    adb连接安卓设备失败failed to start daemon
    Linux greybus
    Android安卓版本、API级别和Linux内核对应关系
    「转」Android编译选项中的eng、user、user-debug
    高通SOC启动流程
    Android for MSM Project
  • 原文地址:https://www.cnblogs.com/FlyCat/p/2577669.html
Copyright © 2011-2022 走看看