Ответ 1
Да, это проверяется только при подключении отладчика. Это было необходимо, потому что было много кода .NET 1.x, который нарушил это правило. Это не очевидно.
Большая проблема заключается в том, что такой код сошел с рук. Либо удача, не слишком много думая о случайных проблемах с живописью, либо думая, что отмена приложения, когда он затормозится и перезапустить его один раз в день, будет приемлемым. Потому что у программиста не было реальной надежды обнаружить проблему без диагностики.
Microsoft много заботится о отсталой совместимости, даже если это багги. Исправление отличное, хотя иногда это неправильно (Show (owner) проверяется, когда он не должен). И иногда пропускает проверку, когда это код в структуре, которая нарушает правило. Это происходит, когда зависимость потока является косвенной. Наиболее распространенными случаями этого являются обновление источника данных связанного с данными управления в рабочем потоке (сначала отключайте!) И используя элемент управления, который прослушивает событие SystemEvents.UserPreferenceChanged(не создавайте интерфейс во втором потоке!)
Для справки соответствующий код присутствует в статическом конструкторе класса Control:
static Control()
{
//...
checkForIllegalCrossThreadCalls = Debugger.IsAttached;
//...
}