Я пишу программу, которая отображает состояние определенных служб на нескольких удаленных компьютерах.В настоящее время я использую ServiceController для получения этих данных, и он работает нормально при наличии соответствующих разрешений.
Однако, когда пользователь не имеет доступа к удаленному компьютеру, программа значительно замедляется.Например, при заполнении ListView необходимыми данными для инициализации программе потребуется около минуты, чтобы сгенерировать и перехватить 5 System.InvalidOperationException.
Я предполагаю, что это просто занимает некоторое время в сети, ноЯ разрываюсь с точки зрения, как работать через эту проблему.Похоже, что на этом сайте некоторые выступают за разработку вокруг использования обработки исключений по соображениям производительности, в то время как другие заявляют, что важно перехватывать исключения при выполнении реального файлового ввода-вывода на случай, если что-то изменится между проверкой и вводом-выводом.,
Моя внутренность в том, что обработка исключений - это то, что нужно, потому что в противном случае я смотрю на проверку разрешений, что кажется нежелательным.(см .: Проверка разрешений на запись в каталог и файл в .NET ).Кто-нибудь знает, как я могу решить эту проблему производительности?
Ниже приведен код, который замедляет работу программы.Большое спасибо за любые советы по этому поводу!
ServiceController sc = new ServiceController();
sc.MachineName = line;
sc.ServiceName = "VRaySpawner 2016";
try
{
if (sc.Status.Equals(ServiceControllerStatus.Running))
entry[1] = "ON";
sc.ServiceName = "BACKBURNER_SRV_200";
if (sc.Status.Equals(ServiceControllerStatus.Running))
entry[2] = "ON";
}
catch (InvalidOperationException e)
{
entry[1] = "Access Denied";
Debug.WriteLine("Exception Caught");
}
Обновление 1 на основе комментариев ServiceController используется для запуска и остановки служб на удаленных машинах.Для этого он извлекает имена удаленных компьютеров из списка:
ServiceController sc = new ServiceController();
sc.ServiceName = "BACKBURNER_SRV_200";
foreach (ListViewItem item in listView1.SelectedItems)
{
String strItem = item.SubItems[0].Text;
sc.MachineName = strItem;
if (sc.Status.Equals(ServiceControllerStatus.Stopped) ||
sc.Status.Equals(ServiceControllerStatus.StopPending))
sc.Start();
}
Трассировка стека при возникновении исключения:
System.InvalidOperationException
HResult=0x80131509
Message=Cannot open VRaySpawner 2016 service on computer 'dto302322'.
Source=System.ServiceProcess
StackTrace:
at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
at System.ServiceProcess.ServiceController.GenerateStatus()
at System.ServiceProcess.ServiceController.get_Status()
at RenderFarmDemo.Form1.refreshList() in C:\Apps\RenderFarmDemo\RenderFarmDemo\Form2.cs:line 219
at RenderFarmDemo.Form1.button5_Click(Object sender, EventArgs e) in C:\Apps\RenderFarmDemo\RenderFarmDemo\Form2.cs:line 207
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at RenderFarmDemo.Program.Main() in C:\Apps\RenderFarmDemo\RenderFarmDemo\Program.cs:line 19
Inner Exception 1:
Win32Exception: Access is denied