C#闭包
http://www.cnblogs.com/jiejie_peng/p/3701070.html
1、如果不设置临时值,MailMgr.SendMail(result[i]);i会直接取外层的最后的值,导致超出索引
内层函数引用的外层函数的变量的最终值。就是说,当线程中执行方法时,方法中的i参数的值,始终是result.Count。
避免闭包陷阱呢?C#中普遍的做法是,将匿名函数引用的变量用一个临时变量保存下来,然后在匿名函数中使用临时变量。
var result = MsMq.Intance.MessageEnumerator<SendObj>((int)MessageType.Email); if (result == null && result.Count() == 0) return; int len = result.Count(); Task[] tasks = new Task[len]; int i = 0; for(i=0;i< len; i++) { var _r = result[i];//临时值 tasks[i] = Task.Factory.StartNew(()=> { MailMgr.SendMail(_r);//MailMgr.SendMail(result[i]); }); } try { Task.WaitAll(tasks); } catch(AggregateException e) { foreach (var item in e.InnerExceptions) { string _errStr= string.Format("异常类型:{0}{1}来自:{2}{3}异常内容:{4}", item.GetType(), Environment.NewLine, item.Source, Environment.NewLine, item.Message); Common.Util.Instance.Log("MessageReceive_ErrorLog" + DateTime.Now.ToString("yyyyMMdd"), "0", _errStr); } }

浙公网安备 33010602011771号