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 laRunWorkerCompleted
e 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)