2011-03-04 117 views
0

我正在創建一個新的線程,並在後臺線程方法內工作,然後調用另一個方法來完成工作。c#線程幫助

myThread = new Thread(new ThreadStart(doWork)); 
      myThread.Start(); 

的問題是,當我離開後臺工作方法到另一個方法並執行此:

browser.SelectList(Find.ById("selStartYear")).SelectByValue(startYear); 

我得到一個InvalidCastException

當我的後臺工作人員方法完成時,我需要做一些線程?我看到我啓動了這個線程,但是用它調用的新方法在它上面調用中止,只是暫停了程序。

編輯:我使用的是周華健,並在全球範圍內創造了新的IE

IE browser = new IE("http://www.website.com/"); 

我的輔助方法引用這個一樣失敗的方法。

+0

這看起來像一個無關的錯誤,很難說雖然沒有完整的代碼示例 – BrokenGlass 2011-03-04 04:52:30

+0

一些更多的細節會有所幫助。你的後臺線程在做什麼?什麼是瀏覽器變量?張貼更多的代碼,以便我們瞭解執行順序。 – 2011-03-04 04:54:01

回答

2

不,您不需要對已完成執行的線程執行任何清理。你應該努力不要打電話Abort,因爲這是一種破壞性的方法,並提供一個更「禮貌」的方式來表明它應立即退出的線程優先以Abort劇烈結束。

另外,如果你的工作是不是特別長,運行,那麼你或許應該使用任何新Task類提供System.Threading.Tasks或使用System.Threading.ThreadPool.QueueUserWorkItem()代替紡你自己的線程。

這就是說,您沒有提供足夠的信息來回答您的InvalidCastException問題。它嘗試的是什麼? doWork正文與您失敗陳述中使用的值之間的關係(如果有的話)是什麼?

+0

請參閱我上面的編輯。 – 2011-03-04 05:08:42

+0

我將我的代碼更改爲使用「任務」。如果我等待任務方法完成並將我的另一個方法連接到按鈕,那麼它可以正常工作,但是如果任務方法調用另一個方法,則它不起作用(拋出錯誤)。 – 2011-03-04 06:27:34

+0

@尼克:你還沒有回答什麼是失敗的演員實際上是什麼問題。 – 2011-03-04 13:19:26

0

Adam在線程問題上提供了完整的答案。我只是另一個提示。你的線程(就像我在示例代碼中看到的)不是後臺線程。另外我認爲所有的多線程應用程序都需要一個優雅退出的計劃(考慮系統關閉)。

爲了找出鑄造錯誤的來源,我建議將這行代碼分成3行,因爲其中一個參數的類型不正確。

+0

我試圖在導致問題的行上設置幾個斷點。問題行期待一個字符串,這正是我給它。我很困惑。 – 2011-03-04 05:33:50

+0

@Nick:你應該把它分成3行,找出哪個參數導致了鑄造異常。那麼它更容易找到原因。目前,異常可能是'startYear'或''selStartYear''或'Find.ById()'方法的返回值(由瀏覽器使用)。SelectList()'方法作爲參數)。 – Xaqron 2011-03-04 07:55:20