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