[英]C# timer within new thread
我有一个方法browseWebsite()
使用 webbrowser 控件浏览网站以自动更改该网站内的数据。 当方法被执行时,webbrowser 控件被实例化。 不幸的是,打开的网站部分是通过 ajax 加载的,因此 webbrowser 控件无法检测到网站加载完成的正确时间,这意味着我无法在加载页面时使用DocumentCompleted
事件进一步移动。 为了解决这个问题,我实例化了一个System.Windows.Forms.Timer
以等待 10 秒,直到他让浏览器在网站上进一步移动。 (线程睡眠不起作用,因为 webbrowser 与线程一起冻结并停止加载过程)整个过程如下所示:
private void Form1_Load(object sender, EventArgs e)
{
Thread thread = new Thread(() => browseWebsite());
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
public void browseWebsite()
{
WebBrowser browser = new WebBrowser();
browser.Navigate("somesite");
Timer waitTimer = new Timer();
waitTimer.Interval = 10000;
waitTimer.Tick += delegate (object sender, EventArgs e) { WaitTimer_Tick(sender, e, browser); };
waitTimer.Start();
}
private void WaitTimer_Tick(object sender, EventArgs e, WebBrowser browser)
{
browser.Navigate("somewhere else");
}
由于此方法执行的完整过程非常长且复杂,而且我不想弄乱我的主线程,其中有 50 个浏览器在其中单击,因此我想在另一个线程中启动该过程。 不幸的是,当到达该方法的最后一行时,该线程将死亡,并带走了 webbrowser 和计时器。 有没有办法实例化这样的过程? 或者保持线程活着?
您可以使用无参数Application.Run方法重载
开始在当前线程上运行标准应用程序消息循环,没有表单。
public void browseWebsite()
{
// ...
waitTimer.Start();
Application.Run();
}
但请注意,稍后(完成处理后),您需要调用Application.ExitThread方法(确保从同一线程调用它)
退出当前线程上的消息循环并关闭该线程上的所有窗口。
最后,没有直接关系,但是在使用此类线程时,最好将Thread.IsBackground设置为true
,以免在主线程(主应用程序线程)终止时阻止您的应用进程终止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.