Разветвления CheckForIllegalCrossThreadCalls=false

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

Я нашел, что статья 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()");
  }
}

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

5
задан Community 23 May 2017 в 10:32
поделиться

2 ответа

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

Из документации 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();
    }));
5
ответ дан 14 December 2019 в 04:34
поделиться

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

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

3
ответ дан 14 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: