BackgroundWorker OnWorkCompleted lanza una excepción de hilos cruzados

Tengo un UserControl simple para la paginación de la base de datos, que utiliza un controlador para realizar las llamadas DAL reales. Uso unBackgroundWorker para realizar el trabajo pesado, y en laOnWorkCompleted evento Vuelvo a habilitar algunos botones, cambio unTextBox.Text propiedad y generar un evento para el formulario principal.

Form A tiene mi UserControl. Cuando hago clic en un botón que abre el formulario B, incluso si no hago nada "allí" y solo lo cierro, e intento traer la siguiente página de mi base de datos, laOnWorkCompleted recibe una llamada en el subproceso de trabajo (y no en mi subproceso principal) y genera una excepción de subprocesos cruzados.

En el momento en que agregué un cheque paraInvokeRequired en el controlador allí, pero no es todo el punto deOnWorkCompleted se llamará en el hilo principal? ¿Por qué no funcionaría como se esperaba?

EDITAR

He logrado reducir el problema a arcgis yBackgroundWorker. Tengo la siguiente solución que agrega un comando a arcmap, que abre un simpleForm1 con dos botones.

El primer botón ejecuta unaBackgroundWorker que duerme durante 500 ms y actualiza un contador. En elRunWorkerCompleted método compruebaInvokeRequired, y actualiza el título para mostrar si el método se estaba ejecutando originalmente dentro del hilo principal o del hilo de trabajo. El segundo botón solo abreForm2, que no contiene nada.

En primer lugar, todas las llamadas aRunWorkerCompletedare se hacen dentro del hilo principal (Como se esperaba, ese es el punto central del método RunWorkerComplete, al menos por lo que entiendo de la MSDN enBackgroundWorker)

Después de abrir y cerrarForm2, elRunWorkerCompleted siempre se llama en el subproceso de trabajo. Quiero agregar que puedo dejar esta solución al problema tal como está (verifiqueInvokeRequired en elRunWorkerCompleted método), pero quiero entender por qué está sucediendo en contra de mis expectativas. En mi código "real" me gustaría saber siempre que laRunWorkerCompletede está llamando al método @ en el hilo principal.

Me las arreglé para señalar el problema en elform.Show(); comando en miBackgroundTesterBtn - si usoShowDialog() en cambio, no tengo ningún problema RunWorkerCompleted siempre se ejecuta en el hilo principal). Necesito usarShow() en mi proyecto ArcMap, para que el usuario no esté vinculado al formulario.

También intenté reproducir el error en un proyecto normal de WinForms. Agregué un proyecto simple que simplemente abre el primer formulario sin ArcMap, pero en ese caso no pude reproducir el error: laRunWorkerCompleted se ejecutó en el hilo principal, si uséShow() oShowDialog(), antes y después de abrirForm2. Intenté agregar un tercer formulario para actuar como formulario principal antes de miForm1, pero no cambió el resultado.

Aqu es mi sln simple (VS2005sp1): requiere

ESRI.ArcGIS.ADF (9.2.4.1420)

ESRI.ArcGIS.ArcMapUI (9.2.3.1380)

ESRI.ArcGIS.SystemUI (9.2.3.1380)

Respuestas a la pregunta(4)

Su respuesta a la pregunta