#c# #winforms #multithreading #windows-services #wrapper
#c# #winforms #многопоточность #windows-службы #оболочка
Вопрос:
Чтобы иметь возможность протестировать некоторую логику, связанную с мониторингом служб Windows, я создал оболочку ServiceController, которая в целом выглядит как:
public class ServiceControllerWrapper : IServiceController
{
public ServiceControllerWrapper(ServiceController controller)
{
this.controller = controller;
}
public void Stop()
{
if(controller == null)
return;
// actually the following code is running in a new thread
// but nothing more
try
{
controller.Stop();
}
catch(...)
{
...
}
}
... similar methods
private readonly ServiceController controller;
}
Я разрешил контроллеру иметь значение null, но по-прежнему невозможно получить исключение NullReferenceException из-за проверки на значение null при запуске метода Stop.
Это происходит периодически, и исключение, которое я получаю, является:
System.NullReferenceException Ссылка на объект не установлена на экземпляр объекта. в системе.Процесс обслуживания.ServiceController.Stop().
Ошибка в настоящее время возникает только в 64-разрядной системе Win2008
Есть ли какие-либо ошибки, которые я делаю, или какая-либо причина, по которой контроллер становится нулевым после проверки на not null?
Редактировать:
Помогло заглянуть внутрь кода ServiceController. Прежде чем выполнять какие-либо операции со службами, я вызываю контроллер.Обновите, и он работает хорошо.
Комментарии:
1. Если трассировка стека показывает ServiceController. Остановка как часть трассировки стека, которая предполагает, что исключение генерируется внутри этого метода, а не вашим кодом.
2. @Jon Skeet В MSDN я вижу только два типа исключений, которые могут быть сгенерированы ServiceController. Остановка — исключение Win32Exception и исключение InvalidOperationException. Может ли исключение NullReferenceException быть связано с каким-либо из них?
3. Оно не должно выдаваться, но это может указывать на ошибку внутри фреймворка.
Ответ №1:
Это исключение выглядит так, как будто нулевая ссылка возникает внутри ServiceController.Stop()
. Попробуйте использовать .NET Reflector, чтобы посмотреть, что происходит внутри этого метода.