Как убить поток пула потоков в c # или зависший запрос wmi в c #? - PullRequest
0 голосов
/ 03 октября 2019

У меня есть код на c #, который использует следующее

ThreadPool.QueueUserWorkItem(new WaitCallback(parseEventLogsWmi), new object[] { server } );

, и у меня есть сервер, который вызывает зависание кода и, в конечном итоге, сбой, потому что запрос WMi не завершается своевременно. Я полагаю, что что-то не так с WMI на сервере, несмотря на то, что мне нужен способ справиться с этим, и функции времени ожидания WMI не работают. Я получу ошибку тайм-аута или ошибку квоты в конечном итоге от WMI.

var conOpt = new ConnectionOptions();
conOpt.Impersonation = ImpersonationLevel.Impersonate;
conOpt.EnablePrivileges = true;
var scope = new ManagementScope(String.Format(@"\\{0}\ROOT\CIMV2", server), conOpt);

SelectQuery query = new SelectQuery("Select * from Win32_NTLogEvent Where Logfile = 'System' and TimeGenerated >='" + dateTime + "'");

ManagementObjectSearcher searcher = new 
ManagementObjectSearcher(scope, query);
searcher.Options.Timeout = new TimeSpan(0, 0, 30);
searcher.Options.ReturnImmediately = true;

Существует ли рабочий способ ограничить результаты обратно из WMI до 1000 результатов или заставить работать функцию тайм-аута или получить остальныепотоки, оставленные в пуле потоков после определенного периода времени, и прервать поток в пуле потоков?

1 Ответ

0 голосов
/ 04 октября 2019

Вот как я обошел проблему зависания WMI, я использовал объект eventLogQuery .net с имеющейся у меня структурой потоков. Структура eventLogQuery была очень полезна для понимания, но у меня она работает, как показано ниже для поиска.

// level = 1 is critical, level = 2 is error, level = 3 is warning and level = 4 is information
            // 86400000 is 1 day in milliseconds
            // 259200000 is 3 days in milliseconds
            // 2592000000 is 30 days in milliseconds

            string queryString = "<QueryList>" +
            "  <Query Id=\"0\" Path=\"System\">" +
            "    <Select Path=\"System\">" +
            "        *[System[(Level=1 or Level=2) and" +
            "        TimeCreated[timediff(@SystemTime) &lt; " + historicalDaysInMilliseconds + "]]]" +
            "    </Select>" +
            "  </Query>" +
            "</QueryList>";
            EventLogSession session = new EventLogSession(server);
            EventLogQuery evtquery = new EventLogQuery("System", PathType.LogName, queryString) { ReverseDirection = true };
            evtquery.Session = session;

            EventLogReader logReader = new EventLogReader(evtquery);

            EventRecord entry;
            List<string> eventArr = new List<string>();
            while ((entry = logReader.ReadEvent()) != null)
            {
                foreach (string eventId in events)
                {
                    if (eventId == entry.Id.ToString())
                    {
                        //eventArr.Add(entry.Id.ToString() + " - " + entry.MachineName + " - " + entry.TimeCreated.Value.ToString());
                        Console.WriteLine(entry.Id.ToString() + " - " + entry.MachineName + " - " + entry.TimeCreated.Value.ToString() + " - " + eventArr.Count);
                        returnValue.Add(server + ", " + entry.Id.ToString() + ", " + entry.TimeCreated.Value.ToString());
                        stop = "here";
                    }
                }
            }
...