Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在Asp.Net Framewok线程池中找不到指定的线程_C#_.net_Multithreading_Threadpool - Fatal编程技术网

C# 为什么在Asp.Net Framewok线程池中找不到指定的线程

C# 为什么在Asp.Net Framewok线程池中找不到指定的线程,c#,.net,multithreading,threadpool,C#,.net,Multithreading,Threadpool,全部 我正在编写一个小代码,用于在计算机进程中逐线程搜索id 我的所有代码如下所示,请帮助查看。:) 在另一个类中,我分配了一个线程来执行名为DoNothing ThreadPool.QueueUserWorkItem((t) => Utility.DoNothing((TimeSpan)t), TimeSpan.FromMinutes(1)); 函数DoNothingcode是 public class Utility { public static

全部

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

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

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

    ThreadPool.QueueUserWorkItem((t) => Utility.DoNothing((TimeSpan)t), 
TimeSpan.FromMinutes(1));
函数
DoNothing
code是

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());
                    }

                }
            }
        }
}
我错过什么了吗?为什么我找不到这根线?请帮帮我,谢谢

已更新


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

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

它也是:

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

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

另一方面,这里可能存在一个竞争条件:

ProcessThread[] threads = new ProcessThread[proc.Threads.Count];
proc.Threads.CopyTo(threads, 0);
有可能在数组初始化之后但在执行
CopyTo
之前修改
proc.Threads
。要避免此争用条件,请仅计算一次
proc.Threads
,例如:

var threads = proc.Threads.ToArray();
进程线程是非托管线程;a
线程。CurrentThread
是托管线程;虽然两者是相关的,但不能保证两者之间存在1:1的映射,也不能保证托管线程与同一非托管线程保持关联


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

@Joe.wang:从(非托管)
ProcessThread
到(托管)
线程
或相反的线程是不可能的——我认为这很清楚。
ProcessThread[] threads = new ProcessThread[proc.Threads.Count];
proc.Threads.CopyTo(threads, 0);
var threads = proc.Threads.ToArray();