Можно ли избежать InvalidOperationException при доступе к ProcessThreads? - PullRequest
0 голосов
/ 16 апреля 2019

При сборе свойств всех 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) уже вышел "

Я перехватил это исключение, выяснил, к каким свойствам я все еще могу получить доступ, и сделал соответствующую распечатку, поэтому это работает.

Но это происходит очень часто и приводит к спаму в приложении.

Поэтому вопрос: возможно ли избежать исключения? Можно ли запросить, если поток уже вышел?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...