Это происходит потому, что элементы управления пользовательского интерфейса могут обновляться только из потока пользовательского интерфейса.Когда вы не создаете новый поток, код, который обновляет элементы управления, запускается в потоке пользовательского интерфейса, поэтому он работает так, как вы ожидаете.Когда вы делаете создаете новый поток, потому что этот поток не является потоком пользовательского интерфейса, код, который должен обновлять элементы управления, не может этого сделать.
Выможет гарантировать, что код, который обновляет элементы управления, выполняется в потоке пользовательского интерфейса, изменив вызовы методов на: -
this.BeginInvoke(new Action(() => displayRed1()));
и
this.BeginInvoke(new Action(() => displayGreen1()));
Между прочим (не связано с вашим текущимпроблема): -
Старайтесь избегать создания явного потока.Вместо этого используйте пул потоков для управления потоком за вас, например, ThreadPool.QueueUserWorkItem(x => InitChecks())
.(Обратите внимание, что это все равно будет выполняться в потоке без пользовательского интерфейса, поэтому вам все равно нужно использовать BeginInvoke()
, как описано выше.).Пул потоков лучше знает, когда создавать и выполнять поток, и его использование, в конечном счете, сделает ваш код более эффективным.
Старайтесь избегать перехвата всех типов исключений в ваших try{...}catch{...}
,Это говорит о том, что ваш код знает, что делать, если выброшено исключение любого типа .Вместо этого вылавливайте только те исключения, которые вы точно знаете, как обрабатывать,
, например,
try
{
...
}
catch(TcpException)
{
...
}
catch(AnotherKnownException)
{
...
}
...
Обратите внимание, что можно также иметь блок catch
для all типы исключений, если вы перебрасываете исключение при выходе из блока,
например,
try
{
...
}
catch(KnownException)
{
...
}
catch(Exception)
{
// perform some logging, rollback, etc.
throw;
}