首页新闻招聘找找看知识库

【求大牛】C#中ForEach和foreach的区别是什么?从多线程方面求解

0
悬赏园豆:5 [已解决问题]

如题。

貌似ForEach(q=>{ await  EFContext.SaveChangesAsync() })会报错,使用了同一个上下文错误,如果用的同一个上下文,

但是foreach(var q in list)

{

await  EFContext.SaveChangesAsync() ;不会报错。

}

下面代码又能帮助理解吗?

static void Main(string[] args)
{
  #region Action<T>委托示例
  //需求:打印出整型集合list的元素
  List<int> list = new List<int>() { 1, 2, 3, 4, 5 };
  //将匿名方法分配给 Action<T> 委托实例
  Action<int> concat1 = delegate(int i) { Console.WriteLine(i); };
  list.ForEach(concat1);
  //将 lambda 表达式分配给 Action<T> 委托实例
  Action<int> concat2 = (i => Console.WriteLine(i));
  list.ForEach(concat2);
  Console.ReadKey();
  #endregion 
}
王庆东mas的主页 王庆东mas | 初学一级 | 园豆:2
提问于:2017-07-06 01:33
< >
分享
最佳答案
0

首先你给出的代码和多线程屁关系没有(Parral.Foreach才和多线程有关,名字只是巧合),我不讨论最开始ef保存里面的异常,我只说下面的实际代码

这个List<T> ForEach 方法内部就是用的for遍历

.net 不是开源了吗,去看这个方法的源代码吧,自己做出判断,比找博客解释强的多,理解的深刻的多
希望你能从开源代码中找到真谛

    public void ForEach(Action<T> action)
    {
        if (action == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
        }
        Contract.EndContractBlock();

        int version = _version;

        for (int i = 0; i < _size; i++)
        {
            if (version != _version && BinaryCompatibility.TargetsAtLeast_Desktop_V4_5)
            {
                break;
            }
            action(_items[i]);
        }

        if (version != _version && BinaryCompatibility.TargetsAtLeast_Desktop_V4_5)
            ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
    }
收获园豆:5
给我一个理由 | 初学一级 |园豆:17 | 2017-07-06 04:46

 正解,List的ForEach是.net 3.5的时候推出的吧,如果我没记错的话,和配合Linq的。

ChixTech | 园豆:65 (初学一级) | 2017-07-06 09:08

 这边action(_item[i]) 都是同步去执行吗? 所以

ForEach(q=>{ await  EFContext.SaveChangesAsync() })

所以导致访问了同一个 EF上下文而报错?

王庆东mas | 园豆:2 (初学一级) | 2017-07-06 15:30

shi这样的,ForEach()把await 弄丢了。所以里面所有的执行都是异步去同时进行。没有await了。

王庆东mas | 园豆:2 (初学一级) | 2017-07-08 11:49
   您需要登录以后才能回答,未注册用户请先注册