不知何故,我的线程过早停止,而它应该一直处于活动状态,直到状态变为4,或者线程通过.Abort()
中止。
目前这就是我开始创作的方式:
var thread = new Thread(() =>
{
var t = Thread.CurrentThread;
var cDown = new cDownloader(textBox1, textBox3.Text, this, 10);
updateThreads(t.ThreadState + ": " + t.Name, t);
});
thread.Start();
该线程在cDownloader类中执行几个函数:
不知何故线程似乎激活了所有内容,甚至下载文件,然后关闭自己,同时仍然运行计时器,这很奇怪,因此导致错误,因为找不到当前线程。
我没有在当前线程上调用.Abort()
方法。
所以我的问题是:为什么我的线程过早停止?
答案 0 :(得分:3)
该线程将运行您传递它的委托中的代码。一旦完成,线程将终止。除非updateThreads
包含循环,否则线程将在代理中的最后一个方法调用完成时终止。
答案 1 :(得分:3)
部分问题是以下一行
Name = this.textBox1.Text;
无法从后台线程访问UI并将引发异常。因此,在创建cDownloader
类之后,这一行会抛出并随后杀死该线程。您需要将UI访问权移出后台线程,或者将访问权限封送回UI线程。
答案 2 :(得分:3)
看起来线程中的任何内容实际上都没有阻塞。您可以使用退出标志,如下所示:
var exitRequested = false;
new Thread(
() => {
var t = Thread.CurrentThread;
var cDown = ...
Name = textBox1.Text;
updateThread(...);
while(!exitRequested)
{
/// keep this thread from locking up a CPU core
t.Sleep(10);
}
}
).Start();
以及稍后当您希望线程退出时(当应用程序关闭时,单击exit
按钮等)
exitRequested=true;
循环是必要的,以防止线程提前退出。否则,当它到达你的lambda的末尾时,它就像任何其他方法一样返回。
另请注意,检查线程中的Thread.ThreadState
通常会返回ThreadState.Running
,因为为了执行线程方法中的任何代码,线程必须正在运行。 ThreadState
在该背景之外是有用的。