Как получить доступ к службам удаленно и эффективно в C #?Обработка исключений очень медленная - PullRequest
0 голосов
/ 29 мая 2018

Я пишу программу, которая отображает состояние определенных служб на нескольких удаленных компьютерах.В настоящее время я использую 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 
...