Ваш код как опубликованный не требует ничего дополнительного. Однако он будет работать правильно только в том случае, если никакой другой код не получит доступ к элементу токена во время работы потока. Общий доступ для чтения / записи к переменной должен быть защищен блокировкой. Но это еще не все, вы также должны убедиться, что потоки синхронизированы должным образом, поток, который читает «токен», вероятно, должен подождать, пока рабочий поток обновит значение. Поищите в Google «образец потребительского поведения», и вы найдете множество литературы по этому вопросу.
Если в этом случае вам нужен какой-то код в потоке пользовательского интерфейса, чтобы дождаться завершения RequestImage (), а затем использовать его результат, то самый простой способ обработки синхронизации - позволить RequestImage () вызвать Control.BeginInvoke () когда он завершит работу.
Обратите внимание, что вам также потребуется обработать случай, когда поток пользовательского интерфейса завершается до завершения рабочего потока. Несоблюдение этого требования может привести к исключению ObjectDisposed. Решение Q & D для этого состоит в том, чтобы установить свойство IsBackground потока в True. Убедитесь, что ничего не происходит, когда поток прерывается.