c#线程帮助

c#线程帮助,c#,winforms,C#,Winforms,我正在创建一个新线程,在后台线程方法中,我进行工作,然后调用另一个方法进行工作 myThread = new Thread(new ThreadStart(doWork)); myThread.Start(); 问题是,当我离开后台工作程序方法转到另一个方法并执行以下操作时: browser.SelectList(Find.ById("selStartYear")).SelectByValue(startYear); 我得到一个无效的异常 当我的后台工作程序方法完成时

我正在创建一个新线程,在后台线程方法中,我进行工作,然后调用另一个方法进行工作

myThread = new Thread(new ThreadStart(doWork));
            myThread.Start();
问题是,当我离开后台工作程序方法转到另一个方法并执行以下操作时:

browser.SelectList(Find.ById("selStartYear")).SelectByValue(startYear);
我得到一个
无效的异常

当我的后台工作程序方法完成时,我是否需要对线程执行一些操作?我看到我启动了线程,但在它调用的新方法中调用abort只会挂起程序

编辑:我正在使用WakiN并在全局范围内创建了新的
IE

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

我的worker方法与失败的方法一样引用它。

否,您不需要对已完成执行的线程进行任何清理。实际上,您应该努力永远不要调用
Abort
,因为这是一种破坏性的方法,提供一种更“礼貌”的方式来通知线程它应该立即退出,而不是以
Abort
暴力结束它

此外,如果您的作业不是特别长时间运行,那么您可能应该使用
System.Threading.Tasks
中提供的新
Task
类,或者使用
System.Threading.ThreadPool.QueueUserWorkItem()
而不是旋转自己的线程


也就是说,您没有提供足够的信息来回答您的
InvalidCastException
问题。它在试什么演员?
doWork
的主体与失败陈述中使用的值之间有什么关系(如果有)?

Adam提供了关于线程问题的完整答案。我只想再给你一个提示。您的线程(正如我在示例代码中看到的)不是后台线程。此外,我认为所有多线程应用程序都需要一个优雅退出的计划(考虑系统关闭)


为了找出强制转换错误的来源,我建议将该行代码分成3行,因为其中一个参数的类型不正确。

这看起来像是一个无关的错误,很难说清楚,尽管没有完整的代码示例。一些详细信息可能会有所帮助。你的背景线程在做什么?什么是
浏览器
变量?我试着在引起问题的行上和之前设置一些断点。问题行需要一个字符串,这正是我要给它的。我很困惑。@Nick:你应该把它分成三行,找出哪个参数导致了铸造异常。那就更容易找到原因了。当前,异常可能是
startYear
“selStartYear”
Find.ById()
方法的返回值(该方法由
浏览器使用。SelectList()
方法作为参数)。我将代码更改为使用
任务。如果我等待任务方法完成并将我的另一个方法连接到一个按钮上,它可以正常工作,但是如果任务方法调用另一个方法,它就不工作了(抛出错误)。@Nick:您仍然没有回答失败的转换实际上是什么的问题。失败的转换是变量
startYear
。我的问题是,我从非UI线程调用UI控件,需要调用失败的方法。