На первый взгляд, я бы сказал, что вы вносите некоторые изменения в графический интерфейс вашего класса. В связи с тем, что все работает нормально при нажатии кнопки, ваша задача выполняется в потоке графического интерфейса и может получить доступ ко всему там без каких-либо проблем. Если вы передаете свою задачу в собственный поток, у вас нет прямого доступа к GUI.
Для решения этой проблемы вы можете заключить вызовы графического интерфейса в вызов (Begin)Invoke()
(более подробную статью об этих различиях команд можно найти здесь ). Чтобы сделать это немного проще, вы также можете использовать один из следующих методов расширения:
public static class ControlExtensions
{
public static void InvokeIfRequired(this Control c, Action<Control> action)
{
if (c.InvokeRequired)
{
c.Invoke(new Action(() => action(c)));
}
else
{
action(c);
}
}
public static void BeginInvokeIfRequired(this Control c, Action<Control> action)
{
if (c.InvokeRequired)
{
c.BeginInvoke(new Action(() => action(c)));
}
else
{
action(c);
}
}
}
Использование будет:
myTextBox.InvokeIfRequired((ctrl) => ctrl.Text == "SomeNewText");