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:操作界面 }