我在回调和for循环方面遇到了一些问题,
说我有这个代码
public void DoSth(Action<QueryTextureResult> result, IEnumerable<string> arr)
{
int totalData = 0;
foreach (var element in arr) // let's say arr.Count() is 10
{
Action<Texture> onImageReceived = (texture) =>
{
if (result != null)
{
var res = new QueryTextureResult()
{
Texture = texture,
QueryId = queryId,
Index = totalData // why this one is always 10 if the callback takes time?
};
result(res);
Debug.Log("INdex: " + res.Index);
}
};
imageManager.GetImage("http://image.url", onImageReceived);
totalData++;
}
}
如评论中所述,如果我有10个元素,调用
result
需要花费时间,为什么我收到的QueryTextureResult.Index
总是10?是通过引用传递的吗?有任何解决这个问题的方法吗? 最佳答案
发生这种情况是因为totalData
被关闭并且onImageReceived
将被异步调用。
假设您有3个项目,则可以按以下顺序执行:
为项目1声明的onImageReceived
,其输出为totalData
为项目1调用GetImage
totalData = 1
为项目2声明的onImageReceived
,其输出为totalData
项目2调用GetImage
totalData = 2
为项目3声明的onImageReceived
,其输出totalData
对项目3调用GetImage
totalData = 3
项1已完成,将调用onImageReceived
事件,其输出totalData
...现在为3
项2已完成,它调用了onImageReceived
事件,而totalData
也为3
项目3相同
关于c# - C#整数作为回调中的引用传递?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40276079/