При сборе свойств всех ProcessThread
чужих Process
вот так (в C #):
process.Threads.OfType<ProcessThread>()
.Aggregate($"Native Threads Report:{Environment.NewLine}\t Id StartTime PrivilegedProcessorTime TotalProcessorTime BasePriority ThreadState{Environment.NewLine}\t{new string('-', 97)}",
(a_Accu, a_Th) => a_Accu += GetThreadInfos(a_Th));
Все работает нормально, пока один (или более) из этих потоков не завершат работу. Затем в методе GetThreadInfos()
происходит InvalidOperationException
:
/// <summary>Returns property informations of the ProcessThread, formatted as text table</summary>
private static string GetThreadInfos(ProcessThread p_Th)
{
string l_Id = string.Empty;
System.Diagnostics.ThreadState l_State = System.Diagnostics.ThreadState.Unknown;
int l_BasePriority = -1;
try
{
l_Id = p_Th.Id.ToString().PadLeft(6);
l_State = p_Th.ThreadState;
l_BasePriority = p_Th.BasePriority;
return $"{Environment.NewLine}\t{l_Id} {p_Th.StartTime.ToISO8601()} {p_Th.PrivilegedProcessorTime.ToString().PadRight(23)} {p_Th.TotalProcessorTime.ToString().PadRight(18)} {l_BasePriority.ToString().PadRight(12)} {p_Th.ThreadState.ToString()}";
}
catch (Exception)
{
return $"{Environment.NewLine}\t{l_Id} [Thread access error]{string.Empty.PadLeft(23)} {string.Empty.PadLeft(18)} {l_BasePriority.ToString().PadRight(12)} {l_State.ToString()}";
}
}
Сообщение об исключении:
- Оригинал: "Die Anforderung kann nicht verarbeitet werden, da der
Тема (TID) "
- Мой перевод: "Запрос мог
не обрабатывается, потому что поток (TID) уже вышел "
Я перехватил это исключение, выяснил, к каким свойствам я все еще могу получить доступ, и сделал соответствующую распечатку, поэтому это работает.
Но это происходит очень часто и приводит к спаму в приложении.
Поэтому вопрос: возможно ли избежать исключения? Можно ли запросить, если поток уже вышел?