设置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();
}
/// <summary>
/// 验证服务连接是否正确
/// </summary>
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();
}
}));
}