如何在C#中杀死线程池线程或在C#中终止WMI查询?

问题描述 投票:0回答:1

我有使用以下代码的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个结果,或者使超时功能起作用,或者使剩余的线程在时间限制后保留在线程池中,然后终止线程池中的线程?

c# multithreading wmi threadpool wmi-query
1个回答
0
投票

这是解决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";
                    }
                }
            }
© www.soinside.com 2019 - 2024. All rights reserved.