【问题标题】:Why is my code stuck on Form2Thread.Join()?为什么我的代码卡在 Form2Thread.Join() 上?
【发布时间】:2011-01-20 14:13:36
【问题描述】:

从我读到的关于这个 .Join() 的内容来看,它似乎要等待相关线程完成其操作,然后再加入并继续执行主代码。但是,据我所知,当我的代码卡在 .Join() 上时,该线程不再运行并且似乎已经关闭。在有问题的线程上命中的最后一行代码是 this.Close()。任何想法正在发生什么以及如何解决它?

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

我可能还应该补充一点,这是一个间歇性问题,不会一直发生。

这是线程开始:

//Start the thread to continuously receive while the LP dialog is open 
Thread Form2Thread = new Thread(new ThreadStart(this.Nep450_ThreadLowPower));

这是 .Join() 之前的代码:

else if (Form2.g_IsOKPressed)//This variable is set in the thread in qustionFomr
                        {                          
                            g_bThreadLowPowerTerminate = true;
                            Thread.Sleep(500);
                            Form2Thread.Join();

我找到了问题的根源。当第二次运行代码时,以下行被命中并导致问题。删除后就没有问题了。

this.Invoke(new EventHandler(CloseLPDialog));

【问题讨论】:

  • 一个代码示例会很有帮助。如果您可以向我们展示您的主线程的一部分(创建和启动线程以及执行Join 的部分),我们也许能够发现问题。

标签: c# .net multithreading visual-studio-2005 windows-ce


【解决方案1】:

该平台不达标。 Join 等待另一个线程完成。尝试在等待使用 join 的线程中编写一些跟踪或调试消息。

显示 this.Nep450_ThreadLowPower 函数。应该有堆栈原因

【讨论】:

  • 这就是我现在正在做的事情,我试图放入一个try catch,但由于某种原因它不允许我放入一个catch。
  • 你在哪里添加try-catch?什么不给你这样做的能力? this.Close() 有什么作用?也许线程是该方法中的堆栈?什么是 Form2Thread 类?
  • 我得到了 try catch 的工作,我显然试图把它放在错误的位置。 This.Close() 在线程上,旨在在代码运行完成后关闭它。
  • 你不应该关闭线程。删除这一行。线程将在没有您干扰的情况下完成。如果您想明确终止它(不推荐),我建议您执行 Thread.GetCurrentThread().Abort();但它很丑陋,不应该在琐碎的场景中使用。
  • 不确定它是否适用于此,因为此表单可能会多次打开和关闭。试图弄清楚如何判断它是否已经打开。
【解决方案2】:

最好在调用 Join() 之前检查线程的状态:

if (aThread.ThreadState == ThreadState.Running)
{

    aThread.Join();

}

编辑:既然您已经发布了一个代码示例,我认为您应该检查您是否真的需要 Thread.Sleep(500) 调用。

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

【讨论】:

  • 你的线程到底发生了什么?它可能处于 WaitSleepJoin 状态吗?
  • 不应该,最长的thread.sleep等待时间是2秒。当我转到线程的代码时,我看不到任何变量的任何值或命中任何断点,我假设这意味着线程已关闭。
  • 好的,尝试删除 Thread.Sleep(500) 调用并将您的 Form2Thread.Join() 修改为 Form2Thread.Join(500)
猜你喜欢
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2016-05-29
  • 2023-03-28
相关资源
最近更新 更多