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:操作界面
}
原文地址:https://www.cnblogs.com/SuperMetalMax/p/6186967.html