Я знаю, что если я изменяю элемент управления из другого потока, я должен позаботиться, потому что WinForms и WPF не позволяют изменять состояние управления из других потоков.Почему только пользовательский интерфейс разрешает изменять пользовательский интерфейс?
Почему это ограничение на месте?
Если я могу написать потокобезопасный код, я должен иметь возможность модифицировать состояние управления безопасно. Тогда почему это ограничение присутствует?
Я считаю, что одна из причин, по которой это ограничение существует, состоит в том, что всегда существует не более одного потока, гарантированного прослушиванием цикла сообщений Windows. –
@Tim: Это неправильно, существует несколько потоков пользовательского интерфейса, каждый из которых имеет свой собственный цикл сообщений. Например, разрешено разворачивать второй поток, чтобы отобразить диалог индикатора выполнения. –
@Ben: этот пост отмечен C#. В приложении .Net вы всегда должны маршировать управление обратно в поток GUI для выполнения работы, связанной с рисованием (или рискованного поведения или исключения). Конечно, это не мешает вам создавать любое количество потоков для выполнения фоновой работы. Что касается прослушивания входящих сообщений Win32, единственный способ, которым я это знаю (кроме внешнего вызова), - это «защищенный переопределить void WndProc (ref Message m)». Теоретически, может принимать сообщения, переданные этому методу, и использовать их в любом потоке. –