BackgroundWorker OnWorkCompleted lança exceção de thread cruzado

Eu tenho um UserControl simples para paginação de banco de dados, que usa um controlador para executar as chamadas DAL reais. Eu uso umBackgroundWorker para realizar o trabalho pesado e noOnWorkCompleted evento reative alguns botões, altere umTextBox.Text e crie um evento para o formulário pa

@Form A contém meu UserControl. Quando clico em algum botão que abre o formulário B, mesmo que eu não faça nada "lá", apenas o fecho e tento trazer a próxima página do meu banco de dados, oOnWorkCompleted é chamado no thread de trabalho (e não no meu thread principal) e lança uma exceção de thread cruzad

No momento em que adicionei um cheque paraInvokeRequired no manipulador de lá, mas não é o objetivo deOnWorkCompleted deve ser chamado no thread principal? Por que não funcionaria como esperado?

EDITAR

Consegui diminuir o problema para arcgis eBackgroundWorker. Eu tenho a seguinte solução que adiciona um comando ao arcmap, que abre um simplesForm1 com dois botões.

O primeiro botão executa umBackgroundWorker que dorme por 500ms e atualiza um contador. NoRunWorkerCompleted método que verificaInvokeRequired e atualiza o título para mostrar se o método estava sendo executado originalmente dentro do thread principal ou do thread de trabalho. O segundo botão apenas abreForm2, que não contém nada.

Em primeiro lugar, todas as chamadas paraRunWorkerCompletedare são feitos dentro do encadeamento principal (como esperado - esse é o ponto de retorno do método RunWorkerComplete, pelo menos pelo que entendi no MSDN emBackgroundWorker)

Depois de abrir e fecharForm2, aRunWorkerCompleted sempre está sendo chamado no thread de trabalho. Quero acrescentar que posso deixar esta solução para o problema como está (verifiqueInvokeRequired noRunWorkerCompleted method), mas quero entender por que isso está acontecendo contra minhas expectativas. No meu código "real", eu gostaria de saber sempre que oRunWorkerCompleted método @ está sendo chamado no thread principa

Consegui apontar o problema noform.Show(); comando no meuBackgroundTesterBtn - se eu usarShowDialog() em vez disso, não tenho problema RunWorkerCompleted sempre roda no thread principal). Eu preciso usarShow() no meu projeto ArcMap, para que o usuário não seja vinculado ao formulári

Eu também tentei reproduzir o bug em um projeto WinForms normal. Eu adicionei um projeto simples que apenas abre o primeiro formulário sem o ArcMap, mas nesse caso eu não conseguia reproduzir o bug - oRunWorkerCompleted correu no thread principal, se eu useiShow() ouShowDialog(), antes e depois da aberturaForm2. Tentei adicionar um terceiro formulário para atuar como um formulário principal antes do meuForm1, mas não mudou o resultado.

Aqu é meu sln simples (VS2005sp1) - requer

ESRI.ArcGIS.ADF (9.2.4.1420)

ESRI.ArcGIS.ArcMapUI (9.2.3.1380)

ESRI.ArcGIS.SystemUI (9.2.3.1380)

questionAnswers(4)

yourAnswerToTheQuestion