我在回调和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/

10-11 07:59