Когда вы не отлаживаете, у вас все еще будут проблемы.
Из документации Control.CheckForIllegalCrossThreadCalls :
Обратите внимание, что незаконное пересечение-потоковые вызовы всегда будут вызывать исключение, когда приложение запускается вне отладчика.
Вам необходимо исправить проблемы.
При этом вы упомянули:
Не желая иметь подобный код для каждой метки, текстового поля и т. Д., К которым обращается поток, не являющийся пользовательским интерфейсом.
Я бы пересмотрел эту позицию.Вы должны попытаться переместить логику, выполняющуюся в отдельном потоке, в отдельные методы или классы, что, в свою очередь, значительно упростит маршалинг вызовов обратно в пользовательский интерфейс.Со временем это сделает ваш код намного более надежным и обслуживаемым.
Обратите внимание, что вы можете использовать Control.Invoke для маршалинга целого набора вызовов пользовательского интерфейса за один вызов, вместо того, чтобы выполнять каждый отдельный набороперация индивидуально.Когда вы закончите, их не должно быть много.
Редактировать:
Например, похоже, что вы загружаете данные.Скажем, у вас (в фоновом потоке) ваш метод загрузки данных:
var myData = LoadData();
this.Invoke( new Action( () =>
{
// Just set all of your data in one shot here...
this.textBox1.Text = myData.FirstName;
this.textBox2.Text = myData.LastName;
this.textBox3.Text = myData.NumberOfSales.ToString();
}));