C# Winfrom Button 防止重复点击

设置Button的Enabled属性为false,本身没什么错, 有朋友遇到设置了为false的为什么在禁用期间再点击会继续执行,我查了下现有说话是winfrom会有消息排队,结果找到了原因,点击事件消息排队原因是你的程序出现了主线程阻塞情况,系统会记录你的点击事件,等程序响应回来后,继续后续的点击事件。我的情况就是这样。


        private void button1_Click(object sender, EventArgs e)
        {
            当程序进来判断Enabled状态,若是false表示上一次未执行完,
            if (!this.button1.Enabled)
            { return; }
            this.button1.Enabled = false;
            //我将业务放在线程里处理,若不让在线程里,this.button1.Enabled = false;不会有禁止效果,因为本次主线程没有完成。
            Task task = new Task(() =>
             //CheckWebConnection是我执行业务处理,Action是个委托,BeginInvoke好像是将主线程所属方法赋值给子线程,说得不对地方多多包涵。
             new Action(CheckWebConnection).BeginInvoke(null, null)
            );
            task.Start();
        }
  /// 
        /// 验证服务连接是否正确
        /// 
        private void CheckWebConnection()
        {

            try
            {
                //若不加上这一句this.Invoke(new InvokeCallBackDelegate(delegate (){  }));
                //会出现控件不是该线程创建。若你在业务处理方法内需要对界面控件进行操作就需要这句话了
                this.Invoke(new InvokeCallBackDelegate(delegate ()
                {
                    this.errorProvider1.Clear();//这是我界面消息控件内容清空
                }));
                
                   // 业务处理
                   //............................
                   //.......业务处理就不展示了..............
                   //............................
                   //下面是返回给界面信息提示
                    this.Invoke(new InvokeCallBackDelegate(delegate ()
                    {
                        this.m_IsWebConnection = false;
                        this.errorProvider1.SetError(this.label3, "服务器IP或端口号错误!");
                    }));
               

            }
            catch (Exception ex)
            {
            }
            finally
            {
                //最后将button的Enabled  设置ture 可用
                this.Invoke(new InvokeCallBackDelegate(delegate ()
                {
                    this.button1.Enabled = true;
                }));
            }


        }

//最后将button的Enabled  设置ture 可用
                在我程序出现一种情况 this.Invoke(new InvokeCallBackDelegate(delegate ()会报错,出现对象已释放,检查下你是否在有关闭窗口情况,关闭窗口,在finally的时候在关闭窗口,用参数reulst 来判断是否关闭窗口。
                

   finally
            {

                this.Invoke(new InvokeCallBackDelegate(delegate ()
                {
                    this.button1.Enabled = true;
                    if (reulst)
                    {
                            // 对Login窗口的操作
                            this.DialogResult = DialogResult.OK;
                        this.Close();
                    }

                }));


            }

 

你可能感兴趣的:(C#,Winfrom)