【问题标题】:Is it possible to name a thread in the Visual Studio debugger?是否可以在 Visual Studio 调试器中命名线程?
【发布时间】:2011-09-20 20:29:22
【问题描述】:

我正在使用 C# 4.0 (winforms) 调试具有 10 多个线程的应用程序。调试时,有一个下拉菜单可以选择我应该调试哪个线程(只能在断点期间访问)。

这些显示为“Win32 线程”、“工作线程”、“RPC 回调线程”等...

我很想在我的代码中为它们命名。我正在通过后台工作人员运行我的所有线程。

编辑:我的解决方案。这可能不会 100% 有效,但它确实可以满足需要。如果标签在某些情况下是错误的,那在我正在使用的上下文中是可以的。

在每个后台工作人员的 *_dowork 事件中,我都将以下代码行放入:

ReportData.TrySetCurrentThreadName(String.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType, MethodBase.GetCurrentMethod().Name));

这是……

  public static void TrySetCurrentThreadName(String threadName)
  {
     if (System.Threading.Thread.CurrentThread.Name == null)
     {
        System.Threading.Thread.CurrentThread.Name = threadName;
     }
  }

【问题讨论】:

    标签: c# winforms visual-studio debugging ide


    【解决方案1】:

    您可以使用Thread.Name 属性,但您只能写入一次 - 所以当您创建线程时,请给它一个合适的名称。

    【讨论】:

    • Windows 中的 API CreateThread 不允许使用名称。我假设 .NET 中的名称只是占位符?如果是,它们可能是读/写的(尽管我想不出重命名线程的用例)。
    • 由于我使用 BackgroundWorkers 来运行我所有的多线程,这是一个安全的操作吗?我会假设它可以根据需要重用线程,所以只命名一次可能是不可接受的。
    • @Abel:.NET 线程不一定是 WinAPI 线程的薄包装器。
    • @greggorob64:你使用BackgroundWorker而不是开始你自己的线程吗?如果您希望线程有一个名称,我怀疑您必须自己启动它。
    • 我进行了一些快速实验,我的 backgroundworker.dowork 将 Thread.Name 设置为“FunctionName”+(staticcounter)++。运行 50 次后,我没有任何异常。当我附加调试器并检查线程名称时,列表中只有“49”和“50”。前 48 个“死亡”并从我的线程列表中消失,或者它允许自己被覆盖。
    【解决方案2】:
    Thread.CurrentThread.Name = "Give your name here";
    

    【讨论】:

    • 当名称已经设置时会抛出System.InvalidOperationException
    猜你喜欢
    • 2013-09-23
    • 2010-12-07
    • 2011-06-27
    • 2010-09-17
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多