C# 整数作为回调中的引用传递?

标签 c# callback int pass-by-reference pass-by-value

我在回调和 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 为项目 1 声明,输出 totalData
  2. 为项目 1 调用 GetImage
  3. 总数据 = 1
  4. onImageReceived 为第 2 项声明,输出 totalData
  5. GetImage 为项目 2 调用
  6. 总数据 = 2
  7. onImageReceived 为第 3 项声明,输出 totalData
  8. 为第 3 项调用GetImage
  9. 总数据 = 3
  10. 第 1 项已完成,它调用 onImageReceived 事件,该事件输出 totalData...现在为 3
  11. 第 2 项已完成,它调用 onImageReceived 事件,并且 totalData 也为 3
  12. 第 3 项相同

关于C# 整数作为回调中的引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40276079/

相关文章:

C#:如何构造这个要被覆盖的方法

c# - 使用 Entity Framework 忽略重复键插入

javascript - 停止代码执行,直到 XMLHttpRequest 周期完成

c# - 如何强制 c# binary int 除法返回 double?

c# - LINQ where 不接受 1 个或 2 个参数

c# - 在 Parallel.For 循环中调试失控线程

javascript - 如何从一个中间件获取另一个中间件中的数据?

javascript - 如何获取回调函数的所有参数

c# - 将 int 导入到另一个类

c++ - 为函数提供字符串或整数