监视c#中的控件而不是使用线程

时间:2011-05-09 06:47:57

标签: c# winforms multithreading

我有一个winform应用程序,其中我有很多需要连续监视的控件。例如,有一个按钮,只有在禁用其他两个按钮时才应启用它,并且它们在不同的实例中禁用。所以我现在正在做的是使用一个线程来监视连续循环中的另外两个按钮,例如

while(true)
{    
if(btn.enabled==false and btn1.enabled==false)
{
bt3.enabled==true
}
}

虽然它做了我需要的东西但对我来说似乎不对。考虑到我必须生成以管理我的控件的线程数量,它也非常昂贵,有些控件需要检查五到六个不同的东西才能执行操作,并且线程似乎是唯一可行的方法。

请告诉我是否有其他方法可以做到这一点

1 个答案:

答案 0 :(得分:6)

这不仅效率低,而且不正确;除了UI线程之外,由于线程关联性,您永远不应该访问控件的属性。 设置属性(启用的分配)特别糟糕,但是阅读它们(启用的检查)已经够糟糕了。

这些表单应该根据事件通知更新自己,而不是连续监控。例如,通过在两个按钮上挂钩EnabledChanged

// (in the form initialization code)
btn.EnabledChanged += UpdateButtons;
btn1.EnabledChanged += UpdateButtons;

//...
private void UpdateButtons(object sender, EventArgs args)
{
     bt3.Enabled = !btn.Enabled && !btn1.Enabled;
}

您也可以(代之以)在导致Enabled属性更改的代码中执行此操作。