跳到底部查询问题;这只是一些额外的信息
我使用组件(GeckoFX)来渲染一些网站,很好,但它只能用于Windows窗体;因为它必须绑定到可以绘制的WinForms对象。因为所有WinForms都在同一个线程中运行,所以我一次只能使用一个GeckoFX实例;所以我决定以WinForm的形式创建一个“工人类”,并在那里添加所有逻辑。表单不需要与主表单通信。
现在我可以启动10个窗口,它们最终会工作,但是每个新窗体都会在所有其他窗体处理完所有GeckoFX事件之前等待,因为你不能在一个线程上使用多个实例。此外,浏览器必须在UIThread上。所以:
是否可以创建多个UI线程(每个表单一个)?
我见过有人这样做([编辑:删除'坏'链接]),但没有人得到他的代码样本工作。让它工作的人最初使用某种形式的自定义消息来做这种事情,但我不知道如何实现这样的事情。
我不认为你问的是你想要的,但是每个线程创建一个消息泵很容易,你只需每个线程调用一次Application.Run。
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[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());
}
}
GeckoFx不需要表格。
GeckoWebBrowser wb = new GeckoWebBrowser();
wb.CreateControl(); //<-- the magic lays here!
wb.DocumentCompleted += delegate{ MessageBox.Show(wb.DocumentTitle); };
wb.Navigate("http://mysite.com");
使用Application.DoEvent()。 要么 创建多重线程表单:
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);
}
似乎有可能。
我拿了backgrounder,打开了TestApp,并在线程/消息泵#2上创建了一个新的Form1:
private void button2_Click(object sender, EventArgs e) {
helper.Background(() => {
Form1 form2 = new Form1();
form2.Show();
});
}
第二个窗口响应鼠标点击等。
实际上没有确认一切看起来是否正确,我正在使用的免费的Visual Studio Express Edition缺少“线程”调试窗口,咳咳。所以我有点黑暗。但它似乎有用。让我知道 :-)。