Чтобы добавить к тому, что говорят другие, вы можете создать делегата, чтобы определить сигнатуру ваших требований к обновлению элемента управления (в данном случае я предполагаю текстовое поле и строку, но это можно определить, как вам нужно), а затемсоздайте метод, который следует за той подписью делегата, которая рекурсивно вызывает себя асинхронно, если это необходимо.
Примерно так:
private delegate void ControlUpdateTextHandler(TextBox ctrl, string text);
public void UpdateControlText(TextBox ctrl, string text)
{
if (ctrl.InvokeRequired)
{
ctrl.BeginInvoke((ControlUpdateTextHandler)UpdateControlText, ctrl, text);
}
else
ctrl.Text = text;
}
Должно работать, если он вызывается из «правильного» потока (поскольку InvokeRequired будет ложным, если он вызывается потоком, которому принадлежит элемент управления), простообновление текста или из «неправильного» потока (поскольку InvokeRequired будет иметь значение true, если вызывается из другого потока), путем постановки в очередь вызова, выполняемого потоком пользовательского интерфейса.