Según su Best Practices:
Gtk # no es un conjunto de herramientas thread-safe, lo que significa que sólo un hilo a la vez puede invocar de forma segura métodos en Gtk #. Este subproceso es típicamente el subproceso que ejecuta el bucle principal (que es cuando el control ha sido transferido explícitamente a Gtk).
Cuando los desarrolladores de aplicaciones necesitan que los subprocesos actualicen algún elemento de la interfaz gráfica de usuario, deben adquirir un bloqueo que les permita emitir invocaciones Gtk # toolkit o hacer que el código se ejecute en el mismo hilo que el hilo que ejecuta el ciclo principal.
Para invocar un método en la secuencia de bucle principal de GTK + y evitar cualquier problema de subprocesamiento con GTK, puede utilizar el método Gtk.Application.Invoke() (si se dirige a Gtk # 1.0 puede usar Gtk.ThreadNotify).
Se proporciona el siguiente ejemplo; debe usar Invoke
para ejecutar cualquier código Gtk desde el bucle principal:
public void ThreadedMethod()
{
Gtk.Application.Invoke(delegate {
do_stuff_in_main_thread();
});
}
¡Los delegados no funcionan !? ¿Utiliza el método Control.BeginInvoke() para invocar delegados? – Cipi
No lo hice, ¿pueden dar más detalles sobre eso? – nubela
Tenga en cuenta que está utilizando GTK, no Windows Forms, por lo que la API es diferente (ver a continuación). –