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:操作界面
    }
  • 相关阅读:
    FR5一二维码设置条码值
    is application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem
    sql server 2012插入排序后的数据到临时表无效
    Fr3设置图片打印
    created a ThreadLocal with key of type [oracle.jdbc.driver.AutoKeyInfo$1]
    jdbc oracle 连接串
    初玩PLSQL连接 Oracle
    java.lang.NumberFormatException: For input string: "F"
    网站被截持到赌博网
    java时间差
  • 原文地址:https://www.cnblogs.com/SuperMetalMax/p/6186967.html
Copyright © 2011-2022 走看看