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);
                }
            }

 

posted @ 2017-10-26 18:05  wjl910  阅读(63)  评论(0)    收藏  举报