Вам потребуется стать партнером Google , чтобы сделать ваш поток доступным.
Существует общее эмпирическое правило который, поскольку, который говорит, не обновляют 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 об этом здесь и более длинного более включенного здесь.
Существует обсуждение, связанное с этим здесь и один здесь.
По существу Вы используете, Вызывают для выполнения его.
Всего наилучшего
Почему Вы не хотите делать это с помощью BackgroundWorker? Это имеет фантастическое событие обратного вызова под названием ProgressChanged, который сообщает потоку UI об обновлениях, идеально подходящих для progess обновлений типа панели и т.п..
Я также рассмотрел бы InvokeRequired (только VS2008), когда вызов Вызывает. Существуют времена, что Вы не будете обновлять UI от отдельного потока. Это сохраняет издержки создания делегата и т.д.
if (InvokeRequired)
{
//This.Invoke added to circumvent cross threading exceptions.
this.Invoke(new UpdateProgressBarHandler(UpdateProgressBar), new object[] { progressPercentage });
}
else
{
UpdateProgressBar(progressPercentage);
}