C# 为什么我的代码卡在Form2Read.Join()上?

C# 为什么我的代码卡在Form2Read.Join()上?,c#,.net,multithreading,visual-studio-2005,windows-ce,C#,.net,Multithreading,Visual Studio 2005,Windows Ce,从我所读到的关于这个.Join()的内容来看,它似乎在等待相关线程完成其操作之后,才加入并继续使用主代码。然而,据我所知,当我的代码卡在.Join()上时,该线程不再运行,似乎已经关闭。在所讨论的线程上命中的最后一行代码是this.Close()。你知道发生了什么事以及如何解决吗 这是一个在WindowsCE手持设备上运行的C#可执行程序 我可能还应该补充一点,这是一个间歇性的问题,并非总是发生 这是线程的开始: //Start the thread to continuously receiv

从我所读到的关于这个.Join()的内容来看,它似乎在等待相关线程完成其操作之后,才加入并继续使用主代码。然而,据我所知,当我的代码卡在.Join()上时,该线程不再运行,似乎已经关闭。在所讨论的线程上命中的最后一行代码是this.Close()。你知道发生了什么事以及如何解决吗

这是一个在WindowsCE手持设备上运行的C#可执行程序

我可能还应该补充一点,这是一个间歇性的问题,并非总是发生

这是线程的开始:

//Start the thread to continuously receive while the LP dialog is open 
Thread Form2Thread = new Thread(new ThreadStart(this.Nep450_ThreadLowPower));
这是.Join()前面的代码:

我找到了问题的根源。第二次运行代码时,以下行被命中并导致问题。一旦我把它取下来,就再也没有问题了

this.Invoke(new EventHandler(CloseLPDialog));

这个平台不倾斜。Join等待另一个线程完成。尝试在等待使用join的线程中写入一些跟踪或调试消息


显示此.Nep450_螺纹低功耗功能。应该有堆栈原因

在调用Join()之前检查线程的状态是一种很好的做法:

编辑:既然你已经发布了一个代码示例,我想你应该检查一下你是否真的需要线程。Sleep(500)call


编辑#2:更正了上述代码。

这就是我现在正在做的,我试图加入一个try-catch,但由于某种原因,它不允许我加入一个catch。你在哪里添加try-catch?什么不能让你做到这一点?这个.Close()是做什么的?也许线程是用那种方法堆叠的?什么是Form2Read课程?我得到了“试抓”的机会,我显然是想把它放在错误的地方。This.Close()位于线程上,用于在代码运行完成后将其关闭。您不应该关闭线程。删除这一行。线程将在您不干涉的情况下完成。如果您想显式终止它(不建议这样做),我建议您执行Thread.GetCurrentThread().Abort();但它很难看,不应该在琐碎的场景中使用。不确定它是否适用于此,因为此表单可能会打开和关闭多次。试图找出如何判断它是否已经打开。一个代码示例将非常有用。如果您可以向我们展示主线程的一部分(创建和启动线程的部分,以及执行
连接的部分),我们可能能够发现问题。您的线程中到底发生了什么?它可能处于WaitSleepJoin状态吗?不应该是,最长的线程。睡眠等待时间为2秒。当我转到线程的代码时,我看不到任何变量的任何值,也看不到任何断点,我假设这意味着线程已关闭。好的,尝试删除thread.Sleep(500)调用并将Form2Thread.Join()修改为Form2Thread.Join(500)
this.Invoke(new EventHandler(CloseLPDialog));
if (aThread.ThreadState == ThreadState.Running)
{

    aThread.Join();

}