gpt4 book ai didi

c# - 线程过早停止

转载 作者:太空宇宙 更新时间:2023-11-03 17:54:16 25 4
gpt4 key购买 nike

不知何故,我的线程过早停止,而它应该一直处于事件状态,直到状态变为 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. 对于每个链接,事件都会创建一个新线程来下载文件。

线程似乎以某种方式激活了所有内容,甚至下载了文件,然后自行关闭,同时仍在运行计时器,这很奇怪,因此会导致错误,因为找不到当前线程。

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

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

最佳答案

看起来线程内部的任何东西实际上都没有阻塞。您可以使用退出标志,如下所示:

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 在该上下文之外很有用。

关于c# - 线程过早停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15746799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com