Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XNA C#多线程导致ArgumentOutOfRange异常_C#_Multithreading_Xna - Fatal编程技术网

XNA C#多线程导致ArgumentOutOfRange异常

XNA C#多线程导致ArgumentOutOfRange异常,c#,multithreading,xna,C#,Multithreading,Xna,我想利用多线程,这样我可以在模拟中有更多的粒子 public List<droplet> droplets = new List<droplet>(); private void collide(int indexOfA, int indexOfB) { // collision code that only changes the position of droplet A and B } public List=new List(); 私有无效碰撞(int

我想利用多线程,这样我可以在模拟中有更多的粒子

public List<droplet> droplets = new List<droplet>();
private void collide(int indexOfA, int indexOfB)
{
    // collision code that only changes the position of droplet A and B
}
public List=new List();
私有无效碰撞(int indexOfA,int indexOfB)
{
//仅改变液滴A和B位置的碰撞代码
}
在更新方法中

if (droplets.Count > 1)
{
    for (int i = 0; i < droplets.Count; i++)
    {
        for (int j = i; j < droplets.Count; j++)
        {
            Thread t = new Thread(() => collideParticles(i, j));
            t.Start();
        }
    }
}
if(drops.Count>1)
{
对于(int i=0;i碰撞粒子(i,j));
t、 Start();
}
}
}
i立即超出范围,并且在异常发生时通常为1或2

我做错了什么,我该如何解决

编辑:对于那些对collide方法的作用感到好奇的人,请参见下文

if (droplets[i].collisionRectangle.Intersects(droplets[j].collisionRectangle))
            {
                if (distanceBetween(droplets[i].position, droplets[j].position) < reactDistance * reactDistance)
                {
                    Vector2 sumVector = droplets[i].velocity + droplets[j].velocity;
                    Vector2 resultVector = sumVector / 2;
                    droplets[i].velocity = resultVector;
                    droplets[j].velocity = resultVector;

                    if (droplets[i].position.X > droplets[j].position.X) //x axis
                    {
                        droplets[i].velocity.X += repelSpeed;
                        droplets[j].velocity.X -= repelSpeed;

                        droplets[i].position.X -= -repelSpeed;
                        droplets[j].position.X += -repelSpeed;
                    }
                    else
                    {
                        droplets[i].velocity.X -= repelSpeed;
                        droplets[j].velocity.X += repelSpeed;

                        droplets[i].position.X += -repelSpeed;
                        droplets[j].position.X -= -repelSpeed;
                    }

                    if (droplets[i].position.Y > droplets[j].position.Y) //y axis
                    {
                        droplets[i].velocity.Y += repelSpeed;
                        droplets[j].velocity.Y -= repelSpeed;

                        droplets[i].position.Y -= -repelSpeed;
                        droplets[j].position.Y += -repelSpeed;
                    }
                    else
                    {
                        droplets[i].velocity.Y -= repelSpeed;
                        droplets[j].velocity.Y += repelSpeed;

                        droplets[i].position.Y += -repelSpeed;
                        droplets[j].position.Y -= -repelSpeed;
                    }
                }
            }
if(液滴[i].碰撞矩形.相交(液滴[j].碰撞矩形))
{
if(液滴之间的距离[i]。位置,液滴[j]。位置)液滴[j].position.X)//X轴
{
液滴[i].速度.X+=重复速度;
液滴[j].速度.X-=重复速度;
液滴[i].位置.X-=-重复速度;
液滴[j].位置.X+=-重复速度;
}
其他的
{
液滴[i].速度.X-=重复速度;
液滴[j].速度.X+=重复速度;
液滴[i].位置.X+=-重复速度;
液滴[j].位置.X-=-重复速度;
}
if(液滴[i].position.Y>液滴[j].position.Y)//Y轴
{
液滴[i].速度.Y+=重复速度;
液滴[j].速度.Y-=重复速度;
液滴[i].位置.Y-=-重复速度;
液滴[j].位置.Y+=-重复速度;
}
其他的
{
液滴[i].速度.Y-=重复速度;
液滴[j].速度.Y+=重复速度;
液滴[i].位置.Y+=-重复速度;
液滴[j].位置.Y-=-重复速度;
}
}
}

是的,太乱了。

我可以推荐您使用线程池来处理这类事情吗?分配一个线程并不便宜,而且在渲染时很可能是在一个内部循环中进行的(哎哟!)

我在这里看到的真正问题是,这里存在着记忆障碍,这意味着I&j的价值在所有意图和目的中都是不确定的。将碰撞粒子更改为打印功能:

    static void collideParticles(int i, int j)
    {
        Console.WriteLine("i = {0}, j = {1}", i, j);
    }
我得到了以下结果:

i = 1, j = 3
i = 2, j = 3
i = 3, j = 3
i = 2, j = 3
i = 2, j = 3
i = 2, j = 3
将线程繁殖移动到碰撞粒子中会得到“预期”结果


看不出有什么不对劲。它似乎来自你的
碰撞粒子
方法。你们能展示一下它的实现吗?添加到问题的底部。你们在避免多线程时有相同的行为吗?您尝试过调试它吗?使用多线程:超出范围异常。没有多线程和调用“collide”方法:可以工作,但帧速率低。没有多线程和冲突的代码是内部更新方法:工作正常,帧速率平滑。看起来问题是多线程。可能是因为在更新/删除某些水滴(稍后在代码中)时某些线程仍在运行?不管怎样,你知道它是从哪里来的。下一步:找出原因(和/或替代方案)这是不好的。电话的顺序不是问题。同一液滴上的并发性是相同的。那么我的问题有解决方案吗?如何有效地处理数百个粒子之间的碰撞?
i = 0, j = 0
i = 0, j = 1
i = 0, j = 2
i = 1, j = 1
i = 1, j = 2
i = 2, j = 2