Что лучший способ состоит в том, чтобы обновить средства управления формой от рабочего потока?

Вам потребуется стать партнером Google , чтобы сделать ваш поток доступным.

6
задан Yttrium 15 October 2008 в 23:12
поделиться

4 ответа

Существует общее эмпирическое правило который, поскольку, который говорит, не обновляют UI ни от какого потока кроме самого потока UI. Использование функций BackgroundWorker является хорошей идеей, но Вы не хотите, и что-то происходит на другом потоке, необходимо сделать "Вызывание" или BeginInvoke, чтобы вынудить делегата выполнить метод на потоке UI.

Править: Jon B сделал это правильное замечание в комментариях:

Следует иметь в виду, что Вызывают (), синхронно, и BeginInvoke () является асинхронным. Если Вы используете, Вызывают (), необходимо бояться вызывать мертвую блокировку. Я рекомендовал бы BeginInvoke (), если Вам действительно не нужен вызов, чтобы быть синхронными.

Некоторый простой пример кода:

// Updates the textbox text.
private void UpdateText(string text)
{
  // Set the textbox text.
  m_TextBox.Text = text;
}

public delegate void UpdateTextCallback(string text);

// Then from your thread you can call this...
m_TextBox.Invoke(new UpdateTextCallback(this.UpdateText),
    new object[]{"Text generated on non-UI thread."});

Код выше от FAQ об этом здесь и более длинного более включенного здесь.

10
ответ дан 8 December 2019 в 13:51
поделиться

Существует обсуждение, связанное с этим здесь и один здесь.

По существу Вы используете, Вызывают для выполнения его.

Всего наилучшего

1
ответ дан 8 December 2019 в 13:51
поделиться

Почему Вы не хотите делать это с помощью BackgroundWorker? Это имеет фантастическое событие обратного вызова под названием ProgressChanged, который сообщает потоку UI об обновлениях, идеально подходящих для progess обновлений типа панели и т.п..

свяжитесь с деталями

5
ответ дан 8 December 2019 в 13:51
поделиться

Я также рассмотрел бы InvokeRequired (только VS2008), когда вызов Вызывает. Существуют времена, что Вы не будете обновлять UI от отдельного потока. Это сохраняет издержки создания делегата и т.д.

if (InvokeRequired)
        {
            //This.Invoke added to circumvent cross threading exceptions.
            this.Invoke(new UpdateProgressBarHandler(UpdateProgressBar), new object[] { progressPercentage });
        }
        else
        {
            UpdateProgressBar(progressPercentage);
        }
1
ответ дан 8 December 2019 в 13:51
поделиться
Другие вопросы по тегам:

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