zoukankan      html  css  js  c++  java
  • C# Func的同步、异步调用

    using System;
    
    namespace ActionDemo
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("同步调用开始=>");
                int a = SyncAdd(1, 2);
                Console.WriteLine("同步调用结束:" + a);
    
                Console.WriteLine("--------------------------");
    
                Console.WriteLine("异步调用开始=>");
                AyscAdd(3, 4, (result) =>
                {
                    Console.WriteLine("异步调用结果:" + result);
                });
                Console.WriteLine("异步调用结束");
    
                Console.ReadLine();
            }
    
            /// <summary>
            /// 异步调用
            /// </summary>
            /// <param name="a"></param>
            /// <param name="b"></param>
            /// <param name="callBackAction"></param>
            /// <returns></returns>
            static void AyscAdd(int a, int b, Action<int> callBackAction)
            {
                Func<int> func = () =>
                {
                    return new MyMath().Add(a, b);
                };
                func.BeginInvoke((ar) =>
                {
                    var result = func.EndInvoke(ar);
                    callBackAction.Invoke(result);
                },
                null);
    
            }
    
            /// <summary>
            /// 同步调用
            /// </summary>
            /// <param name="a"></param>
            /// <param name="b"></param>
            /// <returns></returns>
            static int SyncAdd(int a, int b)
            {
                return new MyMath().Add(a, b);
            }
        }
    
        public class MyMath
        {
    
            public int Add(int a, int b)
            {
                System.Threading.Thread.Sleep(5000);
                return a + b;
            }
    
        }
    }

    输出结果如下:

    同步调用开始=>
    同步调用结束:3
    --------------------------
    异步调用开始=>
    异步调用结束
    异步调用结果:7

    //参数类型
    public class CatalogInfo {}
    
    //耗时的方法
    public IList<CatalogInfo> GetEntityByKey(string strId)
    {
      return new IList<CatalogInfo>();
    }
    
    //通过异步操作防止主线程卡顿
    private void IniAllCatalog()
    {
      //初始化Func 此类可以传多个参数,最后一个是返回参数,其余为传入参数
      Func<string, IList<CatalogInfo>> Fun = GetEntityByKey;
      // "1" 为传入参数 list 为返回参数
      Fun.BeginInvoke("1", list =>
      {
        //异步操作结束
        var result = Fun.EndInvoke(list);
        this.BeginInvoke(new Action<IList<CatalogInfo>>(BuildRootTree), result);
      }, null);
    }
    
    //完成异步后对不在同一个线程中的界面进行操作
    private void BuildRootTree(IList<CatalogInfo> TreeRoot)
    {
      //ToDo:操作界面
    }
  • 相关阅读:
    day22 面向对象
    springMVC中 POST 请求数据变乱码问题
    Handler dispatch failed; nested exception is java.lang.AbstractMethodError: Method com/mchange/v2/c3p0/impl/NewProxyResultSet.isClosed()Z is abstract
    java.sql.SQLException: Unknown system variable 'tx_isolation'
    Mysql命令
    paas相关,添加ing
    Angular2中实现基于TypeScript的对象合并方法:extend()
    NgStyle和NgIf控制HTML标签显示的区别
    执行ng build --prod --aot命令报错
    JavaScript中的小陷阱(不定期更新。。)
  • 原文地址:https://www.cnblogs.com/SuperMetalMax/p/6186967.html
Copyright © 2011-2022 走看看