【问题标题】:Why I can not found the specified thread in Asp.Net Framewok thread pool为什么我在 Asp.Net Framework 线程池中找不到指定的线程
【发布时间】:2013-01-30 11:12:39
【问题描述】:

全部

我正在编写一个小代码,用于在计算机进程中按线程 id 搜索线程。

我的所有代码如下所示,请帮忙查看。 :)

    using System.Diagnostics;

    public class NKDiagnostics
    {
        private Process[] m_arrSysProcesses;

        private void Init()
        {
            m_arrSysProcesses = Process.GetProcesses(".");
        }
        public static ProcessThread[] GetProcessThreads(int nProcID)
        {
            try
            {
                Process proc = Process.GetProcessById(nProcID);
                ProcessThread[] threads = new ProcessThread[proc.Threads.Count];
                proc.Threads.CopyTo(threads, 0);
                return threads;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return null;
            }
        }
    }

在另一个类中,我分配了一个线程来执行名为DoNothing的函数

    ThreadPool.QueueUserWorkItem((t) => Utility.DoNothing((TimeSpan)t), 
TimeSpan.FromMinutes(1));

而函数DoNothing代码是

public class Utility
    {
        public static void DoNothing(TimeSpan timeout, TextBox txtThreadId)
        {
            TimeoutHelper helper = new TimeoutHelper(timeout);
            while (true)
            {
                Thread.Sleep(1000 * 5);
                if (helper.RemainingTime() <= TimeSpan.Zero)
                {
                    MessageBox.Show("This thread's work is finished.");
                    break;
                }
                else
                {

                    if (Thread.CurrentThread.IsThreadPoolThread)
                    {
                        MessageBox.show( Thread.CurrentThread.ManagedThreadId.ToString());
                    }

                }
            }
        }
}

我的问题是Thread.CurrentThread.ManagedThreadId显示10,我在所有过程中都搜索了它。但是没找到。

ProcessThread[] m_Threads = NKDiagnostics.GetProcessThreads(processId);
for (int i = 0; i < m_Threads.Length; i++)
            {

                if (m_Threads[i].Id.Equals(10))
                {
                    MessageBox.Show("Found it.");
                }
}

我错过了什么吗?为什么我找不到这个线程?请帮助我。谢谢。

更新

我对这段代码做一些实验的最初想法是试图找到一种方法来获取托管线程的状态。显然,我在这里发布的方式并没有成功。所以我的问题是如何知道具有指定线程 ID 的托管线程的状态?谢谢。

【问题讨论】:

    标签: c# .net multithreading threadpool


    【解决方案1】:

    Thread.ManagedThreadIdProcessThread.Id 没有可比性。第一个由 .NET 运行时分配,第二个是操作系统分配给每个线程的本机线程句柄的值。

    也是not possible to map one to the other:

    操作系统 ThreadId 与托管对象没有固定关系 线程,因为一个非托管主机可以控制之间的关系 托管和非托管线程。具体来说,一个复杂的主机可以 使用 Fiber API 调度多个托管线程 操作系统线程,或在不同的托管线程之间移动 操作系统线程。

    因此,您的代码无法按原样工作。

    顺便说一句,这里可能存在竞争条件:

    ProcessThread[] threads = new ProcessThread[proc.Threads.Count];
    proc.Threads.CopyTo(threads, 0);
    

    proc.Threads 可能在数组初始化之后但在CopyTo 执行之前被修改。为了避免这种竞争条件,只对proc.Threads 进行一次评估,例如:

    var threads = proc.Threads.ToArray();
    

    【讨论】:

    • @Joe.wang:不可能从(非托管)ProcessThread 转到(托管)Thread 或相反——我认为这很清楚。
    【解决方案2】:

    进程线程是非托管线程; Thread.CurrentThread 是一个托管线程;虽然两者是相关的,但不能保证两者之间存在 1:1 映射,也不能保证托管线程与同一个非托管线程保持关联。

    如果您要与非托管线程进行比较,我建议不要查看 ManagedThreadId

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 2011-01-03
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多