2011-03-04 116 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