BackgroundWorker OnWorkCompleted создает исключение для нескольких потоков

У меня есть простой UserControl для подкачки базы данных, который использует контроллер для выполнения реальных вызовов DAL. Я используюBackgroundWorker выполнять тяжелую работу, и наOnWorkCompleted Если я снова включу некоторые кнопки, изменитеTextBox.Text свойство и поднять событие для родительской формы.

Форма А содержит мой UserControl. Когда я нажимаю на какую-то кнопку, которая открывает форму B, даже если я ничего не делаю «там», просто закрываю ее и пытаюсь вывести следующую страницу из моей базы данных,OnWorkCompleted вызывается в рабочем потоке (а не в моем главном потоке) и генерирует исключение между потоками.

На данный момент я добавил чек наInvokeRequired в обработчике есть, но не весь смыслOnWorkCompleted должен вызываться в главном потоке? Почему бы не сработать, как ожидалось?

РЕДАКТИРОВАТЬ:

Мне удалось сузить проблему до ArcGIS иBackgroundWorker, У меня есть следующее решение, которое добавляет команду в arcmap, которая открывает простойForm1 с двумя кнопками.

Первая кнопка запускаетBackgroundWorker который спит в течение 500 мс и обновляет счетчик. вRunWorkerCompleted метод, который он проверяетInvokeRequiredи обновляет заголовок, чтобы показать, когда метод первоначально выполнялся в основном потоке или рабочем потоке. Вторая кнопка просто открываетсяForm2, который ничего не содержит.

Сначала все звонки наRunWorkerCompletedare сделаны в основном потоке (как и ожидалось - вот точка метода RunWorkerComplete, по крайней мере, как я понимаю изMSDN наBackgroundWorker)

После открытия и закрытияForm2,RunWorkerCompleted всегда вызывается в рабочем потоке. Я хочу добавить, что я могу просто оставить это решение проблемы как есть (проверьтеInvokeRequired вRunWorkerCompleted метод), но я хочу понять, почему это происходит вопреки моим ожиданиям. В моем «реальном» коде я бы всегда хотел знать, чтоRunWorkerCompleted метод вызывается в главном потоке.

Мне удалось определить проблему наform.Show(); команда в моемBackgroundTesterBtn - если я используюShowDialog() вместо этого у меня нет проблем (RunWorkerCompleted всегда работает в основном потоке). Мне нужно использоватьShow() в моем проекте ArcMap, чтобы пользователь не был привязан к форме.

Я также пытался воспроизвести ошибку на обычном проекте WinForms. Я добавил простой проект, который просто открывает первую форму без ArcMap, но в этом случае я не смог воспроизвести ошибку -RunWorkerCompleted побежал по основному потоку, использовал ли яShow() или жеShowDialog()до и после открытияForm2, Я пытался добавить третью форму, чтобы выступить в качестве основной формы перед моимForm1, но это не изменило результат.

Вот мой простой sln (VS2005sp1) - требует

ESRI.ArcGIS.ADF (9.2.4.1420)

ESRI.ArcGIS.ArcMapUI (9.2.3.1380)

ESRI.ArcGIS.SystemUI (9.2.3.1380)

Ответы на вопрос(4)

Ваш ответ на вопрос