Ошибка при получении:
Необработанное исключение типа
'System.StackOverflowException'
произошло в System.Management.dll
Мой стек вызовов:
[Управлен ный переход]
System.Management.dll! System.Management.ManagementScope.InitializeGuts (объект
o) + 0x1a3 байта
System.Management.dll! System.Management.ManagementScope.Initialize ()
+ 0xa3 байта
System.Management.dll! System.Management.ManagementScope.Connect ()
+ 0x5 байт
Computer_Managerment.exe! Computer_Managerment.WMI.ComputerInformation.ComputerInformation (строка
ComputerName = "pc357", строка
UserName = "", строка Password = "")
Строка 228 + 0xd байтов C #
Computer_Managerment.exe! Computer_Managerment.ScanAllComputers.Workerthread ()
Строка 95 + 0x1e байтов C #
mscorlib.dll! System.Threading.ThreadHelper.ThreadStart_Context (объект
состояние) + 0x66 байт
mscorlib.dll! System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext
ExecutionContext,
System.Threading.ContextCallback
обратный вызов, состояние объекта) + 0x6f
байт
mscorlib.dll! System.Threading.ThreadHelper.ThreadStart ()
+ 0x44 байта
Код, где я получаю переполнение стека:
try
{
gManager = new ManagementScope(ConnectStr, oConn); //\\\\" +
gManager.Connect(); // This is where the crash happens
}
catch (UnauthorizedAccessException)
{
// Code removed
}
Код в основном работает в этой части
1) У меня есть список всех компьютеров в AD (более 1k)
2) У меня есть 10 потоков, которые крутят цикл while, получая компьютер из списка очередей.
3) Когда у них есть имя компьютера, они создают экземпляр класса ComputerInformation, который выполняет gManager.Connect (); это снова терпит крах.
Это мое понимание того, что этот сбой / стекопотока происходит внутри собственного кода, но я предполагаю, что я делаю что-то не так. Если вам понадобится еще какой-нибудь код, пожалуйста, напишите его.
Pr запросить дополнительный код: это код, в котором живут рабочие (обычно около 10 рабочих)
internal struct stWorkList
{
public Queue<string> Work;
public List<ComputerInformation> CompInfo;
public int FailedComputers;
public int FailedPingCheck;
public int SuccessComputers;
public int TotalComputers;
public int FailedAuth;
public int FailedToContactWMIServer;
}
stWorkList gWorkList;
void Workerthread()
{
Monitor.Enter(gUserName);
Monitor.Enter(gPassword);
string UserName = gUserName;
string Password = gPassword;
Monitor.Exit(gPassword);
Monitor.Exit(gUserName);
while (true)
{
Monitor.Enter(gWorkList.Work);
if (gWorkList.Work.Count == 0)
{
Monitor.Exit(gWorkList.Work);
break;
}
string ComputerName = gWorkList.Work.Dequeue();
Monitor.Exit(gWorkList.Work);
if (ComputerName == null)
continue;
ComputerInformation iCI = new ComputerInformation(ComputerName, UserName, Password);
Monitor.Enter(gWorkList.CompInfo);
gWorkList.CompInfo.Add(iCI);
switch (iCI.Status)
{
case eComputerCheckStatus.Connected:
gWorkList.SuccessComputers++;
break;
case eComputerCheckStatus.FailedPingTest:
gWorkList.FailedPingCheck++;
gWorkList.FailedComputers++;
break;
case eComputerCheckStatus.UnauthorizedAccessException:
gWorkList.FailedComputers++;
gWorkList.FailedAuth++;
break;
case eComputerCheckStatus.FailedToContactWMIService:
gWorkList.FailedToContactWMIServer++;
gWorkList.FailedComputers++;
break;
case eComputerCheckStatus.UnkownFailed:
gWorkList.FailedComputers++;
break;
}
Monitor.Exit(gWorkList.CompInfo);
iCI.Dispose();
}
}
Конструктор в классе ComputerInformation
public ComputerInformation(string ComputerName, string UserName, string Password)
{
gComputerName = ComputerName;
gHardDriveList = new List<stHarddiskInfo>();
gProccessInfo = new List<stProccessInfo>();
gCPUInfo = new List<stCPUInformation>();
gOSInfo = new stOSInfo();
gMemoryInfo = new List<stMemoryInfo>();
gPreformanceMemory = new stPreformanceMemory();
gProccessOverView = new stProccessOverview();
gMonitorInfo = new List<stMonitorInfo>();
gNetworkInfo = new List<stNetworkInfo>();
netMon = new Ping();
PingResponse response = netMon.PingHost(ComputerName, 1);
if (response == null || response.PacketsReceived == 0)
{
gStatus = eComputerCheckStatus.FailedPingTest;
gHasError = true;
return;
}
gComputerIP = response.ServerEndPoint.Address.ToString();
ConnectionOptions oConn = new ConnectionOptions();
oConn.Timeout = new TimeSpan(0, 0, 10);
if (!string.IsNullOrEmpty(UserName) && !string.IsNullOrEmpty(UserName))
{
oConn.Username = UserName;
oConn.Password = Password;
}
string ConnectStr = "\\\\" + ComputerName + "\\root\\cimv2";
try
{
gManager = new ManagementScope(ConnectStr, oConn); //\\\\" +
gManager.Connect(); // this is where it crashes
}
catch (UnauthorizedAccessException)
{
gStatus = eComputerCheckStatus.UnauthorizedAccessException;
gHasError = true;
return;
}
catch (Exception Ex)
{
if (Ex.Message.Contains("The RPC server is unavailable"))
{
gStatus = eComputerCheckStatus.FailedToContactWMIService;
}
else
gStatus = eComputerCheckStatus.UnkownFailed;
gHasError = true;
return;
}
gStatus = eComputerCheckStatus.Connected;
try
{
GetRunningProccessInfo();
GetCPUInformation();
GetHardDriveInfo();
GetOSInfo();
GetMemoryInfo();
GetMonitorInfo();
GetComputerSystem();
}
catch
{
gStatus = eComputerCheckStatus.UnkownFailed;
gHasError = true;
}
}