using System;

namespace ActionDemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("同步调用开始=>");
int a = SyncAdd(, );
Console.WriteLine("同步调用结束:" + a); Console.WriteLine("--------------------------"); Console.WriteLine("异步调用开始=>");
AyscAdd(, , (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();
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("", list =>
  {
    //异步操作结束
    var result = Fun.EndInvoke(list);
    this.BeginInvoke(new Action<IList<CatalogInfo>>(BuildRootTree), result);
  }, null);
} //完成异步后对不在同一个线程中的界面进行操作
private void BuildRootTree(IList<CatalogInfo> TreeRoot)
{
  //ToDo:操作界面
}
04-14 02:43