异步委托四步走
来源:互联网 发布: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("执行完毕");}
异步委托四步走–源代码
阅读全文
0 0
- 异步委托四步走
- 异步委托
- 异步委托
- 异步委托
- 异步委托
- 异步委托
- 异步委托-等待委托
- 使用.NET异步委托
- 线程 和异步委托
- 异步委托实例
- 异步委托调用
- C#异步委托
- 异步委托的用法
- 委托异步调用
- 异步委托调用
- 异步委托调用
- 事件、委托、异步同步
- 委托同步与异步
- Git使用,实战版
- 查看类是否包含在jar包中
- POJ 2356 Find a multiple(抽屉原理)
- qt 读写文件
- 数理逻辑1 -- 命题演算5
- 异步委托四步走
- JVM高级特性与实践(九):类加载器 与 双亲委派模式(自定义类加载器源码探究ClassLoader)
- Hibernate的QBC与HQL分页查询
- 电脑新建文件或者更改东西,无法刷新,提示错误---解决办法
- PAT B1013.数素数
- MYSQL学习笔记(六)创建计算字段
- strcat字符串拼接函数
- 三年经验 这是我在博客园看的 深有感触 放在这里激励自己吧
- Oracle查询之分组函数