C# 缓存的进程。线程而不是活动值

C# 缓存的进程。线程而不是活动值,c#,multithreading,process,C#,Multithreading,Process,访问进程-对象的线程时遇到问题 似乎System.Diagnostics.Process.Threads是一个缓存数组,而不是在访问时读取。这意味着,检索另一个应用程序的进程、在应用程序的生命周期中存储它并定期访问它的线程将不会产生预期的输出 一个示例显示,新线程未添加到该列表中。另一个(非托管)进程在此循环期间生成线程: var cachedProcess = System.Diagnostics.Process.GetProcessesByName("application").FirstO

访问
进程
-对象的线程时遇到问题

似乎
System.Diagnostics.Process.Threads
是一个缓存数组,而不是在访问时读取。这意味着,检索另一个应用程序的进程、在应用程序的生命周期中存储它并定期访问它的线程将不会产生预期的输出

一个示例显示,新线程未添加到该列表中。另一个(非托管)进程在此循环期间生成线程:

var cachedProcess = System.Diagnostics.Process.GetProcessesByName("application").FirstOrDefault();
Thread.Sleep(5000); 
while(true)
{
    Console.WriteLine("Cached Thread Count: " + cachedProcess.Threads.Count);

    var liveReadProcess = System.Diagnostics.Process.GetProcessesByName("application").FirstOrDefault();
    Console.WriteLine("Live Thread Count: " + liveReadProcess.Threads.Count);
    Console.WriteLine("");

    Thread.Sleep(1000);
}
输出为:

Cached Thread Count: 3
Live Thread Count: 3

Cached Thread Count: 3
Live Thread Count: 4

Cached Thread Count: 3
Live Thread Count: 5

Cached Thread Count: 3
Live Thread Count: 6

Cached Thread Count: 3
Live Thread Count: 7
实际上,我希望
cachedProcess.Threads
上的访问权限等于
liveReadProcess.Threads
,但事实并非如此

有没有一种方法可以在不直接访问WinAPI的情况下缓存进程句柄并更新线程列表

有没有一种方法可以在不直接访问WinAPI的情况下缓存进程句柄并更新线程列表

进程
类不会自动更新缓存的线程信息。但是,如果只调用
Process.Refresh()
方法,则可以强制更新:

var cachedProcess = System.Diagnostics.Process.GetProcessesByName("application").FirstOrDefault();
Thread.Sleep(5000); 
while(true)
{
    cachedProcess.Refresh();
    Console.WriteLine("Cached Thread Count: " + cachedProcess.Threads.Count);

    var liveReadProcess = System.Diagnostics.Process.GetProcessesByName("application").FirstOrDefault();
    Console.WriteLine("Live Thread Count: " + liveReadProcess.Threads.Count);
    Console.WriteLine("");

    Thread.Sleep(1000);
}

答案显然是否定的。缓存和实时更新是相互冲突的选项。