如题。
貌似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 }
首先你给出的代码和多线程屁关系没有(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);
}
正解,List的ForEach是.net 3.5的时候推出的吧,如果我没记错的话,和配合Linq的。
这边action(_item[i]) 都是同步去执行吗? 所以
ForEach(q=>{ await EFContext.SaveChangesAsync() })
所以导致访问了同一个 EF上下文而报错?
shi这样的,ForEach()把await 弄丢了。所以里面所有的执行都是异步去同时进行。没有await了。