Я считаю, что ваша самая большая проблема - не знать, какие функции в .Net являются поточно-ориентированными. Список, например, нет (словарь есть). Хотя вам это может сойти с рук, у вас могут возникнуть проблемы с блокировкой и т. Д.
Вы используете классы и переменные, которые не являются потокобезопасными. Каждый раз, когда вы работаете с потоками, вы должны быть предельно осторожны с блокировками. Чтобы ответить на ваш вопрос, да, вам нужно заблокировать и разблокировать все, с чем вы работаете, если только тип / метод не обрабатывает его специально для вас.
В .Net 4.0 существует много многопоточности (например, PLINQ), которые выполняют большую часть "тяжелой работы" для вас. Хотя вы должны научиться и понимать, как создавать потокобезопасный код самостоятельно, это даст вам преимущество.
Попробуйте передать данные в метод createXML (). Это может помочь изолировать код от других данных, к которым осуществляется доступ. Я бы посоветовал почитать о многопоточности и научиться делать это без фонового рабочего.
Глобальные переменные, как правило, плохая идея. Учитывая ваш код VB, я предполагаю, что это перенос из мира VB6 для вас. Это никоим образом не должно быть оскорбительным, просто пытаться продвинуть свои навыки вперед. Переменная область должна быть максимально ограниченной.
Еще одна мысль, касающаяся вашего кода, заключается в том, чтобы научиться использовать String.Format () при построении строк / путей.
Простая ручная тема в VB, чтобы вы начали:
Dim bThread As New Threading.Thread(AddressOf createXML)
bThread.IsBackground = True
bThread.Start()