接手屎山遇到了一个 for 循环内创建的 Task 取到的值总是超出 for 循环的结束条件的问题,研究了 6 个小时还没解决,请大佬帮忙看看

2023-02-24 03:29:28 +08:00
 edis0n0

故障代码:

在开发环境中 DataSources.Count 最大为 2 ,也就是 dsIndex 只有可能是 0,1 ,在 Task.Factory 外下断点拿到的值也确实都是 0,1 ,但在 Task.Factory 里拿到的 dsIndex 却总是 2 ,已经超出了 for 循环结束条件了,难道这个 Task 在循环结束才被开始执行?应该要怎么修改比较好?

4348 次点击
所在节点    .NET
22 条回复
hez2010
2023-03-10 12:28:13 +08:00
很经典的错误
dsIndex 在被捕获进 Task.Factory 里的 lambda 时被提升到堆了,并且生命周期被延长,Task.Factory 获得的实际上是对 dsIndex 的引用 (如果不这么做的话你就没法在闭包内修改外部的局部变量)
所以当 Task.Factory 里面的代码被真正执行的时候,你外面的 for 循环已经把 dsIndex 加到 2 然后退出循环了,自然闭包里面拿到的值就会是 2
hez2010
2023-03-10 12:30:43 +08:00
解决方法也很简单,自己加一个局部变量,不要直接用 for 的循环变量就行了.
for (...) {
var j = dsIndex;
然后这里的 Task.Factory 里用 j 而不是 dsIndex
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/918707

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX