gpt4 book ai didi

c# - 在 "IsAlive"属性为 false 后,Join 拒绝承认子线程已终止。 C#

转载 作者:太空狗 更新时间:2023-10-30 01:25:41 29 4
gpt4 key购买 nike

简而言之:我从我的表单启动一个线程,然后在一段时间后对其使用 Join 方法。它终止了,但我的应用程序卡在了 Join 上,并且拒绝承认它已完成加入。什么会导致这种情况发生?我的线程是从表单上的一个按钮启动的,并尝试从同一表单上的第二个按钮加入。

更多信息:我有一个使用线程来完成通信和数字运算的应用程序。假设Main Form是父线程,第一个子线程是Child1。启动后,Child1 与外部设备建立了一些通信并启动了它自己的 2 个子线程(Child2 和 Child3)来处理传入的数据。

当用户决定应用程序停止处理传入数据时,我需要 Child1 终止(因此如果需要,可以在恢复之前更改 com 设置)。我设置了一个停止事件并且 Child1 退出其执行循环,它所做的第一件事是通知 Child2 和 Child3 不再需要它们(通过另一个停止事件),Child2 和 Child3 等待 Child1 中的 Join 方法。这很好用。

不起作用的是,在设置提示 Child1 退出其运行循环并终止的停止事件之后,表单还在 Child1 上使用了 Join 方法,但是,此 Join 会无限期地等待。

逐步执行:当我逐步执行我的应用程序时,我注意到在使用 Join 之前,IsAlive 属性为 true。在我点击 Child1.Join() 后,我无法再从线程中获取任何信息,因为它位于“JoinWaitSleep”中。但是,如果我运行一个 while 循环导致表单线程在 Child1.IsAlive 为 true 时休眠,这就可以正常工作。我的第二个按钮是否以某种方式成为无法将 Child1 连接到它的线程的一部分?


public void Run()
{ //Known as Child1
//code to setup coms is here

//Launch Builder threads
InsertBackgroundMonitor("Launching Collector Threads");
RunBuilders = true;

//Known as Child2 and Child3
BuildThread1 = new Thread(new ThreadStart(Cam1Builder));
BuildThread2 = new Thread(new ThreadStart(Cam2Builder));
BuildThread1.Start();
BuildThread2.Start();

while (!StopEventHandle.WaitOne(0, true))
{
//// Code that waits for coms and tosses data into lists
}

RunBuilders = false;

//Wait for threads to terminate
BuildThread1.Join();
BuildThread2.Join();
}

private void RunButton_Click(object sender, System.EventArgs e)
{
//Button for running the control thread
ControlThread = new Thread(new ThreadStart(Run));
ControlThread.Start();
}

private void StopButton_Click(object sender, System.EventArgs e)
{
if (btnStop.Enabled)
{ //Button for stopping the control thread
StopEventHandle.Set();

if (ControlThread != null)
{
while (ControlThread.IsAlive)
{
Thread.Sleep(100);
}
//somehow Join did not work
//ControlThread.Join();
}

//Update buttons
btnStart.Enabled = true;
btnStop.Enabled = false;
}
}

最佳答案

没有更多代码很难说,但是您有一些您已经启动但没有正确关闭的资源。

Join() 等待线程完全关闭,并在返回之前释放所有资源。如果 Thread 有任何 BackgroundWorker 任务,或者如果它有任何您没有显示的备用任务仍在运行,它将不会返回。

由于 BuildThread1 和 BuildThread2 都正确返回并加入,您可以确定它不是其中之一,也不是它们正在做的任何事情。查看其余代码。它有什么作用?

编辑:这很好用:

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


Thread ControlThread;
Thread BuildThread1;
Thread BuildThread2;
volatile bool RunBuilders = true;
volatile bool RunControl = true;

private void button1_Click(object sender, EventArgs e)
{
ControlThread = new Thread(new ThreadStart(Run));
ControlThread.Start();
}

private void button2_Click(object sender, EventArgs e)
{
RunControl = false;

if (ControlThread != null)
{
while (ControlThread.IsAlive)
{
Thread.Sleep(100);
}
//somehow Join did not work
ControlThread.Join();
}
}

public void Run()
{ //Known as Child1
//code to setup coms is here

//Launch Builder threads
RunBuilders = true;

//Known as Child2 and Child3
BuildThread1 = new Thread(new ThreadStart(Cam1Builder));
BuildThread2 = new Thread(new ThreadStart(Cam1Builder));
BuildThread1.Start();
BuildThread2.Start();

while (RunControl)
{
//// Code that waits for coms and tosses data into lists
}

RunBuilders = false;

//Wait for threads to terminate
BuildThread1.Join();
BuildThread2.Join();
}


public void Cam1Builder()
{
while ( RunBuilders )
{

}
}
}
}

关于c# - 在 "IsAlive"属性为 false 后,Join 拒绝承认子线程已终止。 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6427079/

29 4 0