using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ThreadCallback
{
class Program
{
public delegate int AddDelegate(int a, int b, int c);
/// <summary>
/// 计算类
/// </summary>
public class Calculation
{
/// <summary>
/// 加法函数
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="c"></param>
/// <returns></returns>
public static int Add(int a, int b, int c)
{
Console.WriteLine("\n开始计算:" + a + "+" + b + "+" + c);
Thread.Sleep(3000); //模拟该方法运行三秒
Console.WriteLine("计算完成!");
return a + b + c;
}
}
static void Main(string[] args)
{
Console.WriteLine("===== 异步回调 AsyncInvokeTest =====");
// 实例化委托
// AddDelegate addDelegate = Calculation.Add;
AddDelegate addDelegate = new AddDelegate(Calculation.Add);
//异步操作接口(注意BeginInvoke方法的不同!)
IAsyncResult result = addDelegate.BeginInvoke(1, 2, 3, new AsyncCallback(CallbackFunc), "AsycState:OK");
Console.WriteLine("------继续做别的事情。。。--------");
Console.ReadKey();
}
/// <summary>
/// 静态回调函数
/// </summary>
/// <param name="syncResult">异步操作状态</param>
static void CallbackFunc(IAsyncResult syncResult)
{
//result 是“加法类.Add()方法”的返回值
//AsyncResult 是IAsyncResult接口的一个实现类,引用空间:System.Runtime.Remoting.Messaging
//AsyncDelegate 属性可以强制转换为用户定义的委托的实际类。
// 获取异步结果
var asyncResult = (AsyncResult)syncResult;
// 获取异步委托对象
var obj = asyncResult.AsyncDelegate;
// 转换为委托类
AddDelegate addDelegate = (AddDelegate)obj;
// 结束线程获取返回值
var res = addDelegate.EndInvoke(syncResult);
Console.WriteLine(res);
Console.WriteLine(syncResult.AsyncState);// 异步状态
}
}
}
参考:https://www.cnblogs.com/jiangyunfeng/p/10658141.html