我写了一个抓网站数据的Windows服务程序,当初用winform写的时候是没有错误的。但是改成服务就出现了问题,我不知道是不是多线程的问题。因为我用的webbrowser类来抓取网站的数据,因为webbrowser本身就带有一个线程,我又用到了timer控件来确定10秒重新获取一下网站的数据。而我要写的是单线程,所以这里就有2个线程了,但是我在mian()这添加了[STAThread],把webbrowser放在主线程这里。然后调试的时候出现了错误。
if (web1.Document.Body != null)
{
IHTMLDocument2 doc = web1.Document.DomDocument as IHTMLDocument2;
string innerhtml = doc.body.innerHTML; //获取html源码
string innertext = doc.body.innerText;
}
错误出现在 web1.Document.Body != null
错误:“由于以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值。”1.我抓取的这个网站必须要用webbrowser才能获取源码,其他的httpwebquest、WebClient等是获取不到的。至少我用它们的时候没获取到。2.我用winform写的时候是正确的,没有任何错误。3.Windows服务现在我也可以调试,错误就是这样找出来的。希望各位大大帮忙,给小弟点思路这是什么情况。
谢谢各位。
if (web1.Document.Body != null)
{
IHTMLDocument2 doc = web1.Document.DomDocument as IHTMLDocument2;
string innerhtml = doc.body.innerHTML; //获取html源码
string innertext = doc.body.innerText;
}
错误出现在 web1.Document.Body != null
错误:“由于以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值。”1.我抓取的这个网站必须要用webbrowser才能获取源码,其他的httpwebquest、WebClient等是获取不到的。至少我用它们的时候没获取到。2.我用winform写的时候是正确的,没有任何错误。3.Windows服务现在我也可以调试,错误就是这样找出来的。希望各位大大帮忙,给小弟点思路这是什么情况。
谢谢各位。
建议你再把你的timer去掉,再看看。
去掉timer?那怎么10秒刷新一次数据?
你不但不该谢,反倒应该骂,如果你用GooGle搜索"web1.Document.Body != null",下面会有更多提示关键字"document.body null",然后点击那个链接搜索"document.body null",第一个查找结果就是http://topic.csdn.net/t/20020705/10/851752.html的链接,这是极度不负责任的做法,如果可以这么做,楼主你也没必要在这里提问了.
唉,惭愧,惭愧,确实是第一个就是http://topic.csdn.net/t/20020705/10/851752.html,当初我搜索"web1.Document.Body != null"的时候发现就只有2个,没有想到下面的提示关键字了,因为要的很急,而一直都解决不了,希望大大谅解。毕竟不管谁怎么回帖,都应该感谢。同时非常感谢“青龙白虎”大大。
web1 :是什么控件名,问题估计就是这个,转成服务以后可能有些调用不到
web1 是webbrowser的对象名:
HtmlElement btnElement = htmlDoc.All["btnClose"];
if (btnElement != null)
{}
改为判断btnElement 内容可以不
窗体程序有webbrowser的控件,服务里webbrowser要动态申明一个
if(web1.document.body!=null) //这里本来一般情况它是可以得到的。但是我抓取的网站是需要加载的,这样的话,我们不能规定延迟几秒钟,同时,我还必须是每10秒钟又要重新获取数据,因为我抓的数据是时时刻刻在变动的。 并且我认为这应该是多线程的问题,但是在网上一直没看到类似的例子。
{
....
}
http://topic.csdn.net/u/20080628/13/bba4b615-5636-46f9-a1df-063cf9960a2e.html
估计是超时了
{
if (e.Url != webBrowser1.Document.Url) return;
// 当 e.Url == webBrowser1.Document.Url 我们要的网页加载完毕
// 加载完毕
// ...
}
恩,我用的是timer.timer控件,就因为这样才导致线程的问题,因为timer.timer就是个线程。
private void web1_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e)
{ }
[STAThread]
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
System.Threading.Thread.Sleep(1000);
web1.Navigate(url); web1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(web1_DocumentCompleted);
//tt2.Stop();
timer1.Interval = 10000;
btnStart();
}
这是我写的判断。
参考这个:
http://zhidao.baidu.com/question/62226910.html
http://topic.csdn.net/u/20080610/17/ca604952-d5a6-47ab-a981-5c6ee8a5e6fd.html
delegate void DoThingCallBack();
private void button1_Click(object sender, EventArgs e)
{
t1 = new Thread(new ThreadStart(caozuo1));
t1.Start();
}
private void caozuo1()
{
if (webBrowser1.InvokeRequired)
{
DoThingCallBack cb = new DoThingCallBack(caozuo1);
this.Invoke(cb);
}
else
{
HtmlElement guanli = webBrowser1.Document.All["Login"];
}
}代碼有判斷webBrowser1.InvokeRequired,也就是當需要的時候才使用委托,而不是任何時候都使用。
如果这样的话,Windows服务它就运行不了了,它会出现:服务启动,但是似乎没有什么可执行的,又关闭了。
private HtmlElementCollection HtmlTR_Content(string strWeb, string tj)
{
try
{ //生成HtmlDocument
WebBrowser webb = new WebBrowser();我也遇到跟你差不多的问题,我的也是抓取数据,但是在网也上他就报 这个错误
当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d
顶到 沙发上
private HtmlElementCollection HtmlTR_Content(string strWeb, string tj)
{
try
{ //生成HtmlDocument
WebBrowser webb = new WebBrowser(); 我也遇到跟你差不多的问题,我的也是抓取数据,但是在网也上他就报 这个错误 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d
一模一样的错无 顶 到楼主上