我是一個不是很先進的學習示例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