2011-05-09 3 views
2

У меня есть приложение winform, в котором у меня есть много элементов управления, которым необходим постоянный мониторинг. Например, есть кнопка, и она должна быть включена только тогда, когда две другие кнопки отключены, и они отключены в отдельных экземплярах. Так что я делаю сейчас использует поток для отслеживания два других кнопок в сплошное время цикла, такие какконтроль контроля в C#, кроме использования потоков

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

хотя это то, что мне нужно, кажется мне неправильным. Также очень дорого, учитывая количество потоков, которые я должен создать для управления моими элементами управления, есть определенные элементы управления, которые должны проверять пять или шесть разных вещей, прежде чем он сможет сделать действие, и потоки кажутся мне единственным способом.

Скажите, пожалуйста, есть ли другой способ сделать это

+0

Как насчет использования таймера? Он разрешит ваши проблемы с потоком, но я все же думаю, что было бы лучше просто установить значение bt3.enabled всякий раз, когда вы делаете изменение, или использовать свойства для установки btn и btn1. и в этих свойствах evalaute и set bt3.enabled –

ответ

6

не только в том, что неэффективно, это неверно; вы никогда не должны обращаться к свойствам элемента управления, кроме как из потока пользовательского интерфейса, из-за близости потока. Настройки свойства (включенное назначение) особенно плохие, но их чтение (включенная проверка) является достаточно плохим.

В отличие от непрерывного мониторинга, эти формы должны обновлять самостоятельно, исходя из уведомлений о событиях. Например, подключив 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 свойство меняться.

+0

Огромное спасибо, im, делающий много этих неэффективных методов в моих приложениях. Например, во всех моих многопоточных приложениях я получаю доступ к элементам пользовательского интерфейса из другого потока. Однако я позаботился о вызовах перекрестных потоков, используя делегат и используя invokerequired. BUt, читая ваш ответ, я чувствую, что даже это не должно быть сделано. Каков наилучший вариант, когда нам нужно совершать вызовы перекрестных потоков для элементов пользовательского интерфейса. – swordfish

+0

@swordfish хорошо, есть только 2, чтобы выбрать действительно, Invoke и BeginInvoke - и они в основном делают то же самое ... –

Смежные вопросы