2015-06-03 2 views
1

У меня возникли проблемы с доступом к темам Process -Object.Cached Process.Threads вместо значения live

Похоже, что 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?

+0

Похоже, что ответа явно нет. Кэширование и живое обновление - это противоречивые варианты. –

ответ

2

Есть ли способ кэшировать дескриптор процесса и обновить список тем, не обращаясь непосредственно к WinAPI?

Класс Process не обновляет информацию о кешированном потоке автоматически. Однако, если вы просто вызвали метод 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); 
}