我有一个非常严重的多线程调试问题。与串行设备进行交互时,我遇到了某种定时问题,因此需要对其进行跟踪。我有三个线程:

  • UI更新的主线程。用户可以通过选择一个预设来更改设备的一个参数,也可以一次更改多个参数。
  • 查询的状态检查线程,以确保仍连接了设备。如果用户关闭设备或以有趣的方式与设备进行交互,则状态更改需要反射(reflect)在UI中。
  • 读取设备响应的串行端口的线程。

  • 我的问题实际上与调试这种情况有关。看来我在每个线程中的每一行都必须有一个断点才能进行调试。如果我闯入一个线程,调试器将不会单步执行该线程。我知道其他线程将继续更新,但是我正在执行的线程是否不应该像调试器中的正常一样执行,即从一行移到另一行?然后,我可以使用“线程”选项卡在线程之间进行切换。

    我提到我加入WPF是因为我完全不知道这是否会改变情况。也许会,也许不会。状态检查线程是UI控件的一部分,因为仅在UI处于启动状态时才需要检查状态。该控件位于与主应用程序不同的库中。

    最佳答案

    如果您的代码以一种奇怪的方式单步执行,则有时可能是由一个简单的损坏的pdb文件引起的。代码上的“全部重建”将从头开始重新生成它,并解决所有此类故障。

    要记住的另一件事是,在调试器中停止一个线程可能会导致各种异常的时序,而您在发行版本中不会看到这种时序。例如:

  • 在断点处停止时,串行端口将始终继续运行(在硬件/驱动程序级别)-下次尝试执行代码时,它可能会突然收到大量数据。使用异步回调,这可能会“很有趣”。
  • 停止一个线程会干扰正常的分片,因此线程到线程的同步可能会搞砸。
  • 关于c# - C#和vs2008中的线程调试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1014324/

    10-17 02:06