Ejecutar múltiples subprocesos de UI

Pase al final de la pregunta; esto es solo algo de información extra

Estoy usando un componente (GeckoFX) para renderizar algunos sitios web, está bien, pero solo se puede usar en Windows Form; ya que tiene que vincularse a un objeto WinForms que se puede dibujar. Como todos los WinForms se ejecutan en el mismo hilo, solo puedo usar una instancia de GeckoFX a la vez; así que decidí crear una ‘clase trabajadora’ en forma de WinForm y agregar toda la lógica allí. El formulario no requiere comunicarse con el formulario principal.

Ahora puedo abrir 10 ventanas y eventualmente funcionarán, pero todas las formas nuevas esperarán antes de que todas las otras formas hayan manejado todos sus eventos GeckoFX, ya que no puedes usar varias instancias en una cadena. Además, el navegador debe estar en un UIThread. Asi que:

¿Es posible crear varios subprocesos de UI (uno para cada formulario)?

He visto a alguien haciéndolo ( http://74.125.77.132/search?q=cache:PrFTaH2nx_YJ:geckofx.org/viewtopic.php%3Fid%3D453+geckofx+service&cd=1&hl=nl&ct=clnk&gl=nl&client=firefox-a ), sin embargo, nadie consiguió que sus muestras de código funcionaran. El chico que lo hizo funcionar originalmente usó alguna forma de bombeo de mensajes personalizados para hacer este tipo de cosas, pero no tengo ni idea de cómo lograr algo así.

No creo que lo que preguntes sea realmente lo que quieres, pero crear un mensaje de bomba por hilo es fácil, solo tienes que llamar a Application.Run una vez por hilo.

static class Program { ///  /// The main entry point for the application. ///  [STAThread] static void Main() { Thread t1 = new Thread(Main_); Thread t2 = new Thread(Main_); t1.Start(); t2.Start(); t1.Join(); t2.Join(); } static void Main_() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } 

Use Application.DoEvent ().
o
Crear múltiples formas de enhebrado:

  Thread form2Thread; Form2 form2; private void Form1_Load(object sender, EventArgs e) { form2Thread = new Thread(RunForm2); form2Thread.SetApartmentState(ApartmentState.STA); form2Thread.Name = "Form2 Thread"; // looks nice in Output window form2Thread.Start(); } public void RunForm2() { form2 = new Form2(); Application.Run(form2); } 

GeckoFx no requiere un formulario.

 GeckoWebBrowser wb = new GeckoWebBrowser(); wb.CreateControl(); //<-- the magic lays here! wb.DocumentCompleted += delegate{ MessageBox.Show(wb.DocumentTitle); }; wb.Navigate("http://mysite.com"); 

Parece que es posible.

Tomé los antecedentes , abrí TestApp y creé un nuevo Form1 en la bomba de mensajes / mensajes nº 2:

 private void button2_Click(object sender, EventArgs e) { helper.Background(() => { Form1 form2 = new Form1(); form2.Show(); }); } 

La segunda ventana responde a los clics del mouse, etc.

Realmente no he verificado si todo parece correcto, la versión gratuita de Visual Studio Express Edition que estoy usando no tiene la ventana de depuración “Threads”, ejem. Así que estoy un poco en la oscuridad. Parece que funciona, sin embargo. Házmelo saber :-).