Вопрос 1
Безопасен ли доступ к (для чтения и записи) переменным-членам класса, который содержит BackgroundWorker, в обработчике событий DoWork в BackgroundWorker? Безопасно ли обращаться к другим переменным, которые не объявлены внутри самого обработчика событий DoWork?
Очевидно, что DoWork не должен обращаться к каким-либо объектам пользовательского интерфейса, скажем, приложения WinForms, поскольку пользовательский интерфейс должен обновляться только из потока пользовательского интерфейса. Но как насчет доступа к другим (не связанным с пользовательским интерфейсом) переменным-членам?
Причина, по которой я спрашиваю, состоит в том, что я видел случайный комментарий, когда Гуглинг говорил, что доступ к переменным-членам не разрешен. Единственный пример, который я могу найти на данный момент, - это комментарий на этой странице MSDN , в котором говорится:
Обратите внимание, что BGW может вызывать исключения, если он пытается получить доступ или изменить переменные уровня класса. Все данные должны быть переданы ему делегатами и событиями.
А также:
НИКОГДА. НИКОГДА. Никогда не пытайтесь ссылаться на переменные, не объявленные внутри DoWork. Может показаться, что время от времени это работает, но на самом деле вам просто везет.
Насколько я знаю, сам MSDN не документирует никаких ограничений такого рода (хотя, если я ошибаюсь, я был бы признателен за ссылку). Но подобные комментарии, похоже, появляются время от времени.
(Конечно, если DoWork выполняет доступ / изменяет переменную-член, которая может быть доступна / изменена основным потоком одновременно, необходимо синхронизировать доступ к этому полю, например, с помощью объекта блокировки. Но выше кавычки, кажется, требуют полного запрета доступа к переменным-членам, а не просто синхронизации доступа!)
Вопрос 2
Чтобы сделать это более общим вопросом, существуют ли какие-либо другие (не задокументированные?) Ограничения, о которых должны знать пользователи BackgroundWorker, кроме вышеперечисленного? Может быть, есть "лучшие практики"?