Нужно переключиться, по необходимости, в поток, которому принадлежит TextBox.
Для проверки используется функция CheckAccess(). Её нет в Intellisence (то есть в автодобавлении), но она нормально компилируется.
Если вы находитесь не в нужном потоке, то для вызова кода в нужном используется функция Invoke, от объекта Dispatcher того объекта, в потоке которого нужно выполнить код.
Код примерно такой (возможны синтаксические ошибки - нет под рукой студии):
void AddText(string message)
{
if (!textbox.CheckAccess())
{
textbox.Dispatcher.Invoke(new Action<string>(AddText), message);
}
else
{
textbox.AppendText(message);
}
}