2

我使用下面的代码来获取当前运行进程中的线程列表。

Process p=Process.GetCurrentProcess();
var threads=p.Thread;

但我的要求是知道创建线程的文件名或模块名。

请指导我实现我的要求。

4

1 回答 1

1

我会争取获得文件名。可以做到,但可能不值得付出努力。相反,将 上的Name属性设置Thread为创建它的类的名称。

Name使用 Visual Studio 调试器检查时,您将能够看到该值。如果您想通过代码获取当前进程中所有托管线程的列表,那么您需要创建自己的线程存储库。您不能将 a 映射ProcessThread到 a,Thread因为两者之间并不总是一对一的关系。

public static class ThreadManager
{
  private List<Thread> threads = new List<Thread>();

  public static Thread StartNew(string name, Action action)
  {
    var thread = new Thread(
      () =>
      {
        lock (threads)
        {
          threads.Add(Thread.CurrentThread);
        }
        try
        {
          action();
        }
        finally
        {
          lock (threads)
          {
            threads.Remove(Thread.CurrentThread);
          }
        }
      });
    thread.Name = name;
    thread.Start();
  }

  public static IEnumerable<Thread> ActiveThreads
  {
    get 
    { 
      lock (threads)
      {
        return new List<Thread>(threads); 
      }
    }
  }
}

它会像这样使用。

class SomeClass
{
  public void StartOperation()
  {
    string name = typeof(SomeClass).FullName;
    ThreadManager.StartNew(name, () => RunOperation());
  }
}

更新:

如果您使用的是 C# 5.0 或更高版本,则可以试验新的呼叫者信息属性。

class Program
{
  public static void Main()
  {
    DoSomething();
  }

  private static void DoSomething()
  {
    GetCallerInformation();
  }

  private static void GetCallerInformation(
      [CallerMemberName] string memberName = "",
      [CallerFilePath] string sourceFilePath = "",
      [CallerLineNumber] int sourceLineNumber = 0)  
  {
    Console.WriteLine("Member Name: " + memberName);
    Console.WriteLine("File: " + sourceFilePath);
    Console.WriteLine("Line Number: " + sourceLineNumber.ToString());
  }
}
于 2013-07-25T18:37:38.310 回答