异步委托四步走

来源:互联网 发布:js对象私有属性 编辑:程序博客网 时间:2024/05/20 15:11

异步委托四步走

第一步:简单的异步委托

public void RunAsyn(){    Action<string> action = ValidateSms;    action.BeginInvoke("hehe", null, null);}private void ValidateSms(string msg){    Console.WriteLine(msg);}

第二步:带回调函数

public void RunAsyn(){    Action<string> action = ValidateSms;    action.BeginInvoke("hehe", CallBackMethod, "我是给回调函数的对象");}private void ValidateSms(string msg){    Console.WriteLine(msg);    Thread.Sleep(1000);    Console.WriteLine("等个一秒钟");}private void CallBackMethod(IAsyncResult iResult){    Console.WriteLine();    Console.WriteLine();    Console.WriteLine("进入回调函数");    if (iResult.IsCompleted)    {        Console.WriteLine("回调函数,最后执行");        Console.WriteLine(iResult.AsyncState.ToString());    }    else    {        Console.WriteLine("异步执行未完成");    }}

第三 步:带返回值的异步委托
对象类

 public class ReturnInfo {     private bool isSuccess = false;     private string msg = "";     private object result = new object();     public bool IsSuccess { get => isSuccess; set => isSuccess = value; }     public string Msg { get => msg; set => msg = value; }     public object Result { get => result; set => result = value; } }

DelegateAsynPrint类

#region 字段属性private float _waitTimeMax = 1; //最大等待时间, 单位秒private int _timeSign = 0;private ReturnInfo _retInfo = new ReturnInfo();public float WaitTimeMax { get => _waitTimeMax; set => _waitTimeMax = value; }public int TimeSign { get => _timeSign; set => _timeSign = value; }public ReturnInfo RetInfo { get => _retInfo; set => _retInfo = value; }#endregion#region 构造方法public DelegateAsynPrint(float waitTimeMax){    _waitTimeMax = waitTimeMax;}#endregion#region methodpublic ReturnInfo RunAsyn(){    Stopwatch sw = new Stopwatch();    sw.Start();    Thread threadToKill = null;    Action<string> action =        (content) =>        {            threadToKill = Thread.CurrentThread;            ValidateSms(content);        };    IAsyncResult iAResultSmsValidate = action.BeginInvoke("hehe", null, null);    while (TimeSign <= WaitTimeMax * 1000) //允许等待的时间内    {        if (iAResultSmsValidate.IsCompleted) //若异步委托业务已完成,则返回异步委托结果        {            return RetInfo;        }        else//若异步委托业务未完成,则挂起0.1秒        {            Console.WriteLine("未执行完,暂停0.1秒。。。");            TimeSign += 100;            iAResultSmsValidate.AsyncWaitHandle.WaitOne(100);        }    }    //若超出允许时间,杀死业务方法    threadToKill.Abort();    sw.Stop();    Console.WriteLine("总共执行了:{0}毫秒", sw.ElapsedMilliseconds);    return RetInfo;}private void ValidateSms(string msg){    Console.WriteLine(msg);    Thread.Sleep(2000);    Console.WriteLine("休息了两秒钟");    RetInfo.IsSuccess = true;    RetInfo.Msg = "成功了";    Console.WriteLine("业务执行完毕");}#endregion

第四步:带返回值的泛型异步委托

DelegateAsynHelper类

#region 字段private ReturnInfo _retInfo = new ReturnInfo();private float _waitTimeMax = 1; //最大等待时间, 单位秒private int _intervalTime = 100;#endregion#region 属性/// <summary>/// 返回消息体/// </summary>public ReturnInfo RetInfo { get => _retInfo; set => _retInfo = value; }/// <summary>/// 最多等待时间/// </summary>public float WaitTimeMax { get => _waitTimeMax;  }/// <summary>/// 挂起时间间隔/// </summary>public int IntervalTime { get => _intervalTime; }#endregion#region 构造方法public DelegateAsynHelper(float waitTimeMax, int intervalTime){    _waitTimeMax = waitTimeMax;    _intervalTime = intervalTime;}#endregion#region methodpublic ReturnInfo RunAsyn<T>(Action<T, ReturnInfo> method, T t){    Thread threadToKill = null;    Action<T> action =           (content) =>           {               threadToKill = Thread.CurrentThread;               method(content, RetInfo);           };    IAsyncResult asynResult = action.BeginInvoke(t, null, null);    int _timeSign = 0;    while (_timeSign <= 1000 * WaitTimeMax)    {        if(asynResult.IsCompleted)        {            return RetInfo;        }        else        {            _timeSign += _intervalTime;            asynResult.AsyncWaitHandle.WaitOne(_intervalTime);        }    }    threadToKill.Abort();    return RetInfo;}#endregion

PrinterHelper类

public static void PrintDelayOneSecond(string name, ReturnInfo info){    Thread.Sleep(1000);    Console.WriteLine(name);    info.IsSuccess = true;    info.Msg = "执行成功";    Console.WriteLine("执行完毕");}

异步委托四步走–源代码

原创粉丝点击