Поражения CheckForIllegalCrossThreadCalls = false

Недавно я обновил приложение от VS2003 до VS2008, и я знал, что буду иметь дело с множеством операций Cross-thread недействительными: Control 'myControl' обратился из потока, отличного от потока, который был создан на "Я обработка этого в том, что я верю, является правильным способом (см. пример кода ниже). Я сталкиваюсь с многочисленными элементами управления, которым потребуется аналогичное исправление. Не желая иметь аналогичный код для каждой метки, текстового поля и т.д., К которым обращается поток неинтерфейса. Каковы последствия просто установки CheckForIllegalCrossThreadCalls = false для всего приложения?

Я нашел статью CodeProject с различными обходными решениями и предупреждение внизу, чтобы НЕ установить свойство. Я ищу другие мнения/опыт по этому вопросу.

private void ShowStatus(string szStatus)
{
    try
    {
        if (this.statusBar1.InvokeRequired) { BeginInvoke(new MethodInvoker(delegate() { ShowStatus(szStatus); })); }
        else { statusBar1.Panels[0].Text = szStatus; }
    }
  catch (Exception ex)
  {
    LogStatus.WriteErrorLog(ex, "Error", "frmMNI.ShowStatus()");
  }
}

Я нашел еще одну статью с некоторыми возможными решениями SO Вопрос 2367718

Ответ 1

Если вы не отлаживаете, у вас все еще будут проблемы.

Из документации Control.CheckForIllegalCrossThreadCalls:

Обратите внимание, что незаконные вызовы с перекрестными потоками всегда будут создавать исключение, когда приложение запускается вне отладчика.

Вам нужно будет исправить проблемы.

При этом вы упомянули:

Не нужно иметь одинаковый код для каждой метки, текстового поля и т.д., к которым обращается поток неинтерфейса.

Я бы пересмотрел эту позицию. Вы должны попытаться переместить логику, запущенную на отдельном потоке, в отдельные методы или классы, что, в свою очередь, сделает марширование вызовов обратно в интерфейс пользователя намного проще. Со временем это сделает ваш код более надежным и обслуживаемым.

Обратите внимание, что вы можете использовать Control.Invoke для маршалирования всего набора вызовов в пользовательском интерфейсе в одном вызове, а не для выполнения каждой отдельной операции установки отдельно. На самом деле не должно быть так много из них, когда вы закончите.

Edit:

Например, похоже, что вы загружаете данные. Скажем, у вас есть (в фоновом потоке) метод загрузки данных:

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();
    }));

Ответ 2

В разделе замечаний документации для CheckForIllegalCrossThreadCalls ясно сказано, что делать это не рекомендуется

Когда поток, отличный от созданного поток элемента управления пытается получить доступ один из этих методов контроля или свойства, он часто приводит к непредсказуемые результаты. Общий Недействительная активность потока - это вызов неправильный поток, который обращается к control Handle свойство. Задавать CheckForIllegalCrossThreadCalls для true найти и диагностировать эту нить легче работать при отладке. Обратите внимание, что нелегальные вызовы с перекрестными потоками всегда будет вызывать исключение, когда приложение запускается за пределами отладчик.