我是一个不是很先进的学习示例C#编码器,这就是为什么无论互联网上的信息量如何,这个问题完全困扰我。定时器和线程的问题
我本质上是创建一个程序,在计时器上反复轮询网站以获取一些信息。在此过程中,将创建一个WebBrowser控件以导航到信息(需要进行身份验证)。程序在启动时运行这一系列事件,然后使用一个设置为每10分钟(当然,调试时减少)的System.Timers.Timer来做同样系列的事件,但是当我的Timer.Elapsed事件触发该过程时,我得到一个:
ThreadStateException与说明书ActiveX控件“{8856F961-340A-11D0-A96B-00c04fd705a2”不能被实例化,因为当前线程不是在一个单一的线程单元。
这是我的程序的瘦身版本。
private void Form1_Load(object sender, EventArgs e)
{
GetDataFromWebBrowser();
Set_Auto_Refresh_Timer();
}
private void Set_Auto_Refresh_Timer()
{
System.Timers.Timer TimerRefresh = new System.Timers.Timer(10000);
TimerRefresh.Elapsed += new System.Timers.ElapsedEventHandler(TimerRefresh_Elapsed);
TimerRefresh.AutoReset = true;
TimerRefresh.Start();
}
private void TimerRefresh_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
GetDataFromWebBrowser();
}
private void GetDataFromWebBrowser()
{
WebBrowser wb = new WebBrowser(); <--This is where the error is thrown.
...get web data...
}
我想我在那里有足够的代码来绘制图片。正如你所看到的,当它创建另一个WebBrowser时,它会抛出错误。
我真的很难过,我只是开始刮在线程上的表面,这可能是我为什么如此难倒。
//我的解决方案/ 我最终将WebBrowser的创建移出了方法,并使其静态重用WebBrowser控件。我也将我的System.Timers.Timer换成System.Threading.Timer。似乎解决了这个问题。
这是因为WebBrowser控件是不允许在自己的线程。你可以使用WebClient吗?否则有一个[STAThread]属性的方法..不知道这是否工作.. – f2lollpll 2012-01-31 07:49:10
我不知道WebBrowser控件,但通常控件只能在窗体运行的线程中使用。您可以切换到一个系统。 Windows.Forms.Timer(在这种情况下你不会是多线程的),或者更难以使用WebRequest(需要一些工作才能获得授权) – 2012-01-31 07:49:26