螺纹过早停止

时间:2013-04-01 15:57:22

标签: c# multithreading

不知何故,我的线程过早停止,而它应该一直处于活动状态,直到状态变为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类中执行几个函数:

  1. 构造函数cDownloader(),它设置了几个变量。
  2. 构造函数触发initLoad(),它会启动一个计时器,并向其添加一个事件。
  3. 计时器刻度事件使用HtmlAgilityPack扫描网站,以获取类fileThumb的链接。
  4. 对于每个链接,事件都会创建一个下载文件的新线程。
  5. 不知何故线程似乎激活了所有内容,甚至下载文件,然后关闭自己,同时仍然运行计时器,这很奇怪,因此导致错误,因为找不到当前线程。

    我没有在当前线程上调用.Abort()方法。

    所以我的问题是:为什么我的线程过早停止?

3 个答案:

答案 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在该背景之外是有用的。