De mi comprensión de .NET, si uso un BackgroundWorker y tienen un controlador de eventos para RunWorkerCompleted, el controlador de eventos se ejecutará en el mismo hilo en el que fue llamado RunWorkerAsync. Si, en cambio, uso BeginInvoke en un delegado para ejecutar un método de forma asincrónica y paso un parámetro AsyncCallback a BeginInvoke, ¿hay alguna forma de que especifique que la devolución de llamada se ejecuta en el mismo subproceso que llamó a BeginInvoke o, en realidad, a un hilo arbitrario? Según entiendo, la devolución de llamada se ejecuta en el siguiente subproceso disponible del grupo de subprocesos. Está bien, pero ¿hay alguna manera de ejecutar código en AsyncCallback en cualquier hilo que quiera? Sé que puede usar BeginInvoke en un formulario o control y hacer código dentro de la ejecución de devolución de llamada en el hilo que creó el elemento UI. ¿Pero qué ocurre si quiero ejecutar código en un hilo que no sea UI sin formularios o controles?¿Se puede especificar el hilo en el que se ejecuta AsyncCallback cuando se utiliza delegate.BeginInvoke?
Respuesta
En el subproceso que desea utilizar como destino para su operación asincrónica, la propiedad CurrentDispatcher es un objeto System.Threading.Dispatcher que se puede usar para forzar una devolución de llamada para ejecutar en ese subproceso.
Esta es la clase base de que la clase de control utiliza para implementar BeginInvoke.
Han surgido preguntas sobre el uso de esto con los formularios de Windows. No creo que esto sea un problema, aunque si tienes un formulario, entonces form.BeginInvoke es una mejor opción. Parece que tanto la forma como WPF usan la misma clase base para manejar la invocación. http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx
El subproceso será siempre un subproceso de grupo de subprocesos y nunca será un subproceso de UI.
Por cierto, C# no tiene ninguna clase BackgroundWorker
. .NET lo hace.
Gracias. No quise dar a entender que BackgroundWorker era específico de C#. Lo saqué. – YWE
Hice una búsqueda y yo terminamos en Jon Skeet's site. Es muy informativo sobre cómo funciona el subprocesamiento con delegados asincrónicos y devoluciones de llamada. Recomiendo esta lectura.
Delegate.BeginInvoke siempre se ejecutará el delegado en el ThreadPool y la AsyncCallback se llama en el mismo subproceso que ejecuta el delegado.
Su única opción es volver a invocar la devolución de llamada en su hilo específico:
AsyncCallback = delegate (IAsyncResult ar)
{
wathever.BeginInvoke(delegate
{
// Do your stuff...
};
};
¿Quiere decir que se llama al AsyncCallback en el mismo hilo que llamó BeginInvoke? Esto parece contrario a lo que entiendo del artículo de documentación de MSDN titulado "Llamando a métodos sincrónicos asíncronamente" (http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx) donde dice "Si el hilo que inicia el la llamada asincrónica no necesita ser el hilo que procesa los resultados, puede ejecutar un método de devolución de llamada cuando finaliza la llamada. " – YWE
No, quise decir que cuando llama a Delegate.BeginInvoke desde el subproceso A, este delegado se ejecuta en un subproceso B en el ThreadPool y luego se llama al AsyncCallback en el subproceso B. –
Es cierto. Acabo de verificarlo. No creo que lo aclaren en la documentación de MSDN. – YWE
- 1. especificar el nombre de un hilo cuando se utiliza Task.StartNew
- 2. ¿Iframe se ejecuta en el mismo hilo que el propietario?
- 3. El hilo se ejecuta solo una vez
- 4. No se puede explotar en 'þ' cuando se utiliza file_get_contents()
- 5. No se puede matar el kernel defectuoso que se ejecuta en la GPU NVIDIA
- 6. Controlar el rastreador cuando se utiliza Twinx
- 7. ¿Cómo se puede depurar el código Arduino que se ejecuta en el hardware Arduino?
- 8. Cuando `PostAuthenticateRequest` se ejecuta?
- 9. ¿Se puede heredar el modelo cuando se utiliza una vista de tipo fuerte en MVC3?
- 10. ¿Se puede prevenir palabras se separen en TextView cuando se utiliza en wrap_content androide
- 11. En Silverlight, ¿cómo se puede saber si el código se ejecuta en el hilo de UI o no?
- 12. ¿Cómo se nombra un hilo que ejecuta una Tarea?
- 13. No se puede serializar el parámetro del tipo 'System.Linq.Enumerable ...' cuando se utiliza WCF, LINQ, JSON
- 14. primavera ThreadPoolTaskExecutor sólo se ejecuta un hilo
- 15. no puede detectar errores de SQL cuando se utiliza ExecuteNonQuery()
- 16. Seguridad Symfony2 cuando se utiliza el enrutamiento i18n?
- 17. 'Excepción en hilo java.lang.NoClassDefFoundError 'principal'' cuando el programa Java se ejecuta desde la línea de comandos
- 18. ClassCastException cuando se utiliza LinearLayout.LayoutParams
- 19. ¿Se puede especificar el número de columnas en read.table?
- 20. error cuando se utiliza mutex
- 21. ¿Puede el código que se ejecuta en un hilo de fondo ser más rápido que en el hilo principal de VCL en Delphi?
- 22. "- (id) init" no se activa en ViewController cuando se utiliza el guión gráfico
- 23. "Pipe está siendo cerrada" cuando se utiliza el WinRT Geolocalizador
- 24. Texto borroso en WPF solo cuando se ejecuta el programa
- 25. ¿Se puede utilizar el nodo-inspector de depurar una aplicación que se ejecuta con Node.js capataz
- 26. consulta lenta cuando se utiliza ORDER BY
- 27. aplicación de función parcial antes de tiempo se ejecuta el bloque de código cuando se utiliza con subrayado
- 28. Cómo configurar que el WCF Test Client se ejecutará cada vez que se ejecuta el servicio
- 29. ¿Por qué el "fin" externo no se ejecuta cuando se lanza el "catch" interno?
- 30. ¿Se puede preservar la transparencia de la imagen PNG cuando se utiliza la imagencopia GDlib de PHP que se muestra?
+1 para la propiedad CurrentDispatcher ... – IAbstract
System.Windows.Threading.Dispatcher es específica de WPF y no tiene cualquier cosa que tenga que ver con el hilo donde se llama a AsyncCallback de Delegate.BeginInvoke. –
@Jeff: proporciona un método BeginInvoke alternativo para permitir la orientación de la devolución de llamada. Por lo que puedo decir, esto es lo que realmente quiere y simplemente confundió su terminología al hacer la pregunta. –