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)