C#fast eventHandler调用

时间:2015-08-05 10:14:17

标签: c# event-handling locking

我正在做一个简单的二维铁路模拟器而且我坚持建造一条直轨。 我有一个由小型PictureBox(控件)组成的地图,用作建筑物的块。我想实现:我点击一个块并移动鼠标,例如向左和向右,当我从起点和后面移动到我的起点时,我的轨道会出现并消失。

我用这段代码实现了它:

        public static void HandleMouseEnterWhileBuilding(Block sender) //only while building straights
        {
            if (sender.x - startingPoint.x >= sender.y - startingPoint.y && currentRotation == "horizontal") //then keep it horizontal
            {               
                    for (int i = 0; i < currentlyPrebuilt.Count; i++)
                    {
                        currentlyPrebuilt[i].Image = null;
                    }
                    currentlyPrebuilt.Clear();

                    for (int i = 1; i <= sender.x - startingPoint.x; i++) //prefills all wanted blocks with rails
                    {
                        currentlyPrebuilt.Add(MainForm.map[startingPoint.x + i, startingPoint.y]);
                        MainForm.map[startingPoint.x + i, startingPoint.y].ImageLocation = @"Images\horizontalRail.png";
                    }                    
            }
        }

它只是一个用于在startingPoint右侧构建rails的分支,而仅当我将鼠标移动得非常慢时才能工作。如果我快速向右移动鼠标,它会构建所有想要的轨道块,但是当我将它移动到起始点时,它会“忘记”移除一些,或者有时候所有的轨道,这是很奇怪的,导致代码,来自currentlyPrebuilt列表&lt;&gt;的每个图像在被清除之前被删除,似乎清除操作超过它并且一些rails永远不会被删除,因为它们不再在列表中。

所以它会发生,当有新事件时,前一个处理程序的执行会跳过吗?

我的假设是有很多事件处理程序调用,它们启动了在相同结构上工作的新线程,但我得知UI调用不会启动新线程。

当我删除行currentlyPrebuilt.Clear();时,它工作得很好,虽然它总是留下一些块,但是在几个mouseEnters(我的事件)上它最终删除了用户想要的一切。但是,无限地用指针填充List会感觉很糟糕。

0 个答案:

没有答案