Правило таково, что только поток, который создает элемент управления UI, должен связываться с ним.Это одна из причин, по которой вообще существует «поток пользовательского интерфейса», и он не дает вам угадывать, нужно ли вам Invoke
что-то делать или просто делать это.(Если событие происходит из элемента управления пользовательского интерфейса, оно находится в потоке пользовательского интерфейса, так что вы можете просто сделать это. В противном случае Invoke
.) Итак, вы хотите создать свои элементы управления в этом потоке, и пусть это будет тот, который обрабатывает всепользовательский интерфейс в том виде, в котором он был предназначен.
Ваш поток пользовательского интерфейса имеет одну цель: обрабатывать все события из пользовательского интерфейса, чтобы приложение реагировало и не выглядело "замороженным".Иногда он будет занят (от обработки других событий), но всегда должен либо обрабатывать событие, либо ждать другого. Никогда не звоните Thread.Sleep
в потоке пользовательского интерфейса , если у вас нет чертовски веских причин и вы не можете конкретно сказать, почему это не ужасная идея.Почти все, что вы хотели бы сделать с Thread.Sleep
, можно вместо этого обрабатывать с помощью таймеров и быть гораздо менее шатким.
Короткая версия: да, если поток пользовательского интерфейса что-то делает (даже спит), вызываетControl.Invoke почти наверняка подождет, пока это не так.Если нить спит, это может занять очень много времени.