【问题标题】:Is there a way to query running threads inside your C# application by thread name?有没有办法通过线程名称查询 C# 应用程序中正在运行的线程?
【发布时间】:2015-10-30 16:13:41
【问题描述】:

如果你做过类似的事情

Thread logSend = new Thread(() => senddat.SendLoggedData());
logSend.Priority = ThreadPriority.AboveNormal;
logSend.Name = "BackLogThread";
logSend.IsBackground = false;
logSend.Start();

您是否可以稍后从另一个线程简单地验证是否有一个名为 "BackLogThread" 的线程当前正在运行?

我不想对线程做任何事情,我只想查询我的应用程序中的线程,看看是否有一个具有特定名称的线程。

编辑:

就与这个问题相关的另一个问题而言,该解决方案是可行的,但对于我的要求来说有点多。该示例中的人想了解有关线程的很多信息,例如他们的优先级等,以记录信息。如果有任何名称为 "BackLogThread" 的线程正在运行,我最多希望返回一个 true

【问题讨论】:

  • 您可以只存储对您创建的线程的引用。
  • 我希望有一个比为我的线程创建一个类或类似的东西更简单的解决方案。 .NET 真的没有任何东西可以返回当前活动线程的列表吗?

标签: c# multithreading


【解决方案1】:

据我所知,这是不可能的,因为无法在 C# 中获取所有托管线程。但是您可以手动将它们添加到池中并稍后检索它们。

池/注册表可能如下所示:

public class ThreadRegistry
{
   private static ThreadRegistry instance;
   private readonly object syncRoot = new object();
   private readonly IDictionary<string, Thread> threads = new Dictionary<string, Thread>();

   private ThreadRegistry()
   {
   }

   public static ThreadRegistry Instance => instance ?? (instance = new ThreadRegistry());

   public Thread this[string name]
   {
      get
      {
         lock (this.syncRoot)
         {
            return this.threads[name];
         }
      }
   }

   public void Register(Thread thread)
   {
      lock (this.syncRoot)
      {
         this.threads.Add(thread.Name, thread);
      }
   }

   public bool ThreadExists(string name)
   {
      lock(this.syncRoot)
      {
         return this.threads.ContainsKey(name);
      }
   }
}

【讨论】:

  • 我建议的唯一更改是因为线程是“全局事物”,因此整个类都是静态的。
  • @ScottChamberlain 是的,可能是一个解决方案。但如果您想要多个注册表,则限制使用的类。另一件事是,您必须使用静态 getter 而不是索引器。
  • 这是一个很好的解决方案,但我认为我会选择更简单的东西,要么是静态布尔值,要么是创建一个空文件并检查它是否存在,而不是启动另一个线程,因为它反正不会经常发生。
  • 单例和附加方法怎么样?
猜你喜欢
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多