怎么解决C# 鼠标移动事件不能及时响应的问题

接触C# 不到一个月 基础也挺糟糕,现碰到一个问题:当我运行程序后 有意的快速移动鼠标就会出现图1的bug,我大概知道是因为鼠标的MouseMove事件无法及时响应导致的。有什么方法能避免这个bug吗,希望得到大家的指点。感谢!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FinalTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public int lattice_w = 0;//定义一个整型变量用来接收鼠标每次移动后所占的格子列数
        public int lattice_h = 0;//定义一个整型变量用来接收鼠标每次移动后所占的格子行数
        public List<Button> btnList = new List<Button>();//用来存放所有按钮控件的集合
        private bool ischanged = true;

        private void btn_MouseMove(object sender, MouseEventArgs e)
        {
            Button btn = (Button)sender;//将object参数对象转换成Button
            this.panel1_MouseMove(this, new MouseEventArgs(MouseButtons.Left, 0, btn.Location.X + e.X, btn.Location.Y + e.Y, 0));

        }


        int w = 0, h = 0;
        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            w = (int)Math.Ceiling((decimal)(e.X) / 26);//获得鼠标光标位置对应的列数(26为每个矩形框尺寸加上距离另一个矩形框间距的总长)
            h = (int)Math.Ceiling((decimal)(e.Y) / 26);//获得鼠标光标位置对应的行数

            if ((w * h) > 16)
            {
                if (lattice_w > w) //列数较上一次鼠标位置向左边方向移进 这一步把之前着色的最后两列染成白色(因为有(w * h) > 16这个前提)
                {
                    for (int i = 0; i < lattice_h; i++)
                    {
                        for (int j = 0; j < lattice_w; j++) // j的范围是[0,w]的整数    w = lattice_w - 1
                        {
                            if (j >= w)  // j的范围是[0,w]的整数    w = lattice_w - 1
                            {
                                btnList[i * 11 + j].FlatAppearance.BorderColor = Color.White; //最右边的一列着色为白色
                            }
                            else
                            {
                                btnList[i * 11 + j].FlatAppearance.BorderColor = Color.Red;
                            }
                        }

                    }
                }
                else // 列 较上一次鼠标位置向右方移动或不变
                {
                    for (int i = 0; i < lattice_h; i++)
                    {
                        for (int j = 0; j < w; j++)
                        {
                            btnList[i * 11 + j].FlatAppearance.BorderColor = Color.Red;
                        }
                    }
                }
                if (lattice_h > h) //行数方向 鼠标位置向上方移动
                {
                    for (int i = h; i < lattice_h; i++)
                    {
                        for (int j = 0; j < lattice_w; j++)
                        {
                            btnList[i * 11 + j].FlatAppearance.BorderColor = Color.White;
                        }
                    }
                }
                else
                {
                    for (int i = lattice_h; i < h; i++)
                    {
                        for (int j = 0; j < lattice_w; j++)
                        {
                            btnList[i * 11 + j].FlatAppearance.BorderColor = Color.Red;
                        }
                    }
                }
            } //if ((w * h) > 16) 结尾

            else
            {
                if (lattice_w > w)
                {
                    for (int i = 0; i < lattice_h; i++)
                    {
                        for (int j = 0; j < lattice_w; j++)
                        {
                            if (j >= w)  // j的范围是[0,w]的整数    w = lattice_w - 1
                            {
                                btnList[i * 11 + j].FlatAppearance.BorderColor = Color.White;
                            }
                            else
                            {
                                btnList[i * 11 + j].FlatAppearance.BorderColor = Color.Lime;
                            }
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < lattice_h; i++)
                    {
                        for (int j = 0; j < w; j++)
                        {
                            btnList[i * 11 + j].FlatAppearance.BorderColor = Color.Lime;
                        }
                    }
                }
                if (lattice_h > h)
                {
                    for (int i = h; i < lattice_h; i++)
                    {
                        for (int j = 0; j < lattice_w; j++)
                        {
                            btnList[i * 11 + j].FlatAppearance.BorderColor = Color.White;
                        }
                    }
                }
                else
                {
                    for (int i = lattice_h; i < h; i++)
                    {
                        for (int j = 0; j < lattice_w; j++)
                        {
                            btnList[i * 11 + j].FlatAppearance.BorderColor = Color.Lime;
                        }
                    }
                }
            }

            lattice_w = w;
            lattice_h = h;
            label1.Text = h + "行 X " + w + "列";


        }//panel1_MouseMove()结尾

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (Control control in panel1.Controls)
            {
                control.MouseMove += new MouseEventHandler(btn_MouseMove);//加载窗体时,将panel中每个button对应的鼠 标移动事件传递给父级控件panel1
                //control.MouseLeave += new EventHandler(panel1_MouseLeave);
                ((Button)control).FlatStyle = FlatStyle.Flat;
                ((Button)control).FlatAppearance.BorderColor = Color.White;//初始化按钮边框样式
                //btnList.Add((Button)control);//将所有按钮控件添加到集合里面
                //Console.WriteLine(((Button)control).Name + "-------");
            }
            //Console.WriteLine(panel1.Controls.Count);

            btnList.Add(button1);
            btnList.Add(button2);
            btnList.Add(button3);
            btnList.Add(button4);
            btnList.Add(button5);
            btnList.Add(button6);
            btnList.Add(button7);
            btnList.Add(button8);
            btnList.Add(button9);
            btnList.Add(button10);
            btnList.Add(button11);
            btnList.Add(button12);
            btnList.Add(button13);
            btnList.Add(button14);
            btnList.Add(button15);
            btnList.Add(button16);
            btnList.Add(button17);
            btnList.Add(button18);
            btnList.Add(button19);
            btnList.Add(button20);
            btnList.Add(button21);
            btnList.Add(button22);
            btnList.Add(button23);
            btnList.Add(button24);
            btnList.Add(button25);
            btnList.Add(button26);
            btnList.Add(button27);
            btnList.Add(button28);
            btnList.Add(button29);
            btnList.Add(button30);
            btnList.Add(button31);
            btnList.Add(button32);
            btnList.Add(button33);
            btnList.Add(button34);
            btnList.Add(button35);
            btnList.Add(button36);
            btnList.Add(button37);
            btnList.Add(button38);
            btnList.Add(button39);
            btnList.Add(button40);
            btnList.Add(button41);
            btnList.Add(button42);
            btnList.Add(button43);
            btnList.Add(button44);
            btnList.Add(button45);
            btnList.Add(button46);
            btnList.Add(button47);
            btnList.Add(button48);
            btnList.Add(button49);
            btnList.Add(button50);
            btnList.Add(button51);
            btnList.Add(button52);
            btnList.Add(button53);
            btnList.Add(button54);
            btnList.Add(button55);
            btnList.Add(button56);
            btnList.Add(button57);
            btnList.Add(button58);
            btnList.Add(button59);
            btnList.Add(button60);
            btnList.Add(button61);
            btnList.Add(button62);
            btnList.Add(button63);
            btnList.Add(button64);
            btnList.Add(button65);
            btnList.Add(button66);
            btnList.Add(button67);
            btnList.Add(button68);
            btnList.Add(button69);
            btnList.Add(button70);
            btnList.Add(button71);
            btnList.Add(button72);
            btnList.Add(button73);
            btnList.Add(button74);
            btnList.Add(button75);
            btnList.Add(button76);
            btnList.Add(button77);
            btnList.Add(button78);
            btnList.Add(button79);
            btnList.Add(button80);
            btnList.Add(button81);
            btnList.Add(button82);
            btnList.Add(button83);
            btnList.Add(button84);
            btnList.Add(button85);
            btnList.Add(button86);
            btnList.Add(button87);
            btnList.Add(button88);
            btnList.Add(button89);
            btnList.Add(button90);
            btnList.Add(button91);
            btnList.Add(button92);
            btnList.Add(button93);
            btnList.Add(button94);
            btnList.Add(button95);
            btnList.Add(button96);
            btnList.Add(button97);
            btnList.Add(button98);
            btnList.Add(button99);
            btnList.Add(button100);
            btnList.Add(button101);
            btnList.Add(button102);
            btnList.Add(button103);
            btnList.Add(button104);
            btnList.Add(button105);
            btnList.Add(button106);
            btnList.Add(button107);
            btnList.Add(button108);
            btnList.Add(button109);
            btnList.Add(button110);
            btnList.Add(button111);
            btnList.Add(button112);
            btnList.Add(button113);
            btnList.Add(button114);
            btnList.Add(button115);
            btnList.Add(button116);
            btnList.Add(button117);
            btnList.Add(button118);
            btnList.Add(button119);
            btnList.Add(button120);
            btnList.Add(button121);

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/131027876046197.png "#left")

        }

        private void panel1_MouseLeave(object sender, EventArgs e)
        {

            /*Console.WriteLine("1111111111111111111111111111111");
            label1.Text = "0 X 0";
            foreach (Control control in panel1.Controls)
            {
                ((Button)control).FlatAppearance.BorderColor = Color.White;
            }*/

            //lattice_h = 0; //每当鼠标从panel移出时,重置lattice_h和lattice_w数值为0
            //lattice_w = 0;
        }
        //由于子线程去更新数据,界面刷新需要在主线程空闲的时候才回去更新数据。当鼠标在移动时,主线程会开辟部分资源去等待响应鼠标事件(这块资源挺大,因为CPU一下子从1涨到了8左右),当子线程刷新数据源过多时,导致CPU属性通知资源不足,从而界面卡死不更新。

    }
}


img

img

事件不存在即使响应,就是只要你触发事件 他就会发消息处理 有异常是多个事件逻辑的问题 看看代码逻辑 自己屡屡

有个办法是
假设间隔为一秒
先记录下鼠标的当前坐标
过1秒后再记录下鼠标当前坐标
两坐标距离除以1秒的时间就是鼠标的移动速度
判断移动速度是否超标,若超标则执行指定函数......