无法捕获调用线程中的 ServiceController.Start() 异常
Unable to catch ServiceController.Start() exceptions in calling thread
如何捕获启动 windows 服务时发生的异常。即使我在服务的 Onstart() 方法中抛出异常,我也无法在下面的代码中获得异常。
public class InterOpIntegrationWinService : ServiceBase
{
protected override void OnStart(string[] args)
{
throw new InvalidOperationException(message);
}
}
调用线程代码
try
{
using (ServiceController controller = new ServiceController())
{
controller.ServiceName = objServiceConfig.ServiceName;
controller.Start();
System.Windows.Forms.Application.DoEvents();
//controller.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 15));
//controller.WaitForStatus(ServiceControllerStatus.Running);
//if (!string.IsNullOrEmpty(LogUtilities.ServiceOnStartException))
//{
// MessageBox.Show("Error with starting service : " + LogUtilities.ServiceOnStartException);
// LogUtilities.ServiceOnStartException = string.Empty;
//}
}
}
catch (System.InvalidOperationException InvOpExcep)
{
DisplayError(InvOpExcep.Message);
LogUtilities.DisplayMessage("Failed to start service. " + LogUtilities.ServiceOnStartException, InvOpExcep);
LogUtilities.ServiceOnStartException = string.Empty;
}
catch (Exception ex)
{
DisplayError(ex.Message);
LogUtilities.DisplayMessage("Failed to start service. " + LogUtilities.ServiceOnStartException, ex);
LogUtilities.ServiceOnStartException = string.Empty;
}
我在 onstart() 方法中检查应用程序许可,如果失败则抛出许可错误。我希望将其共享到我的调用线程,以便我可以在 DialogBox 中显示消息。如果我无法处理调用过程中的异常,关于如何执行此操作的任何想法。
将您的服务分成(至少)两个组件 - 一个以某种形式(例如远程处理、WCF 端点、REST 服务等)处理 IPC 的组件和(一个或多个)执行此操作的组件它的实际工作。
如果许可检查失败,请不要启动其他组件 - 但仍然启动提供 IPC 的组件。在启动您的服务(现在至少应该始终启动)之后,您的基于表单的应用程序可以连接到该服务并(通过您想要的任何方式)确定该服务当前由于许可检查失败而拒绝提供任何功能。
如何捕获启动 windows 服务时发生的异常。即使我在服务的 Onstart() 方法中抛出异常,我也无法在下面的代码中获得异常。
public class InterOpIntegrationWinService : ServiceBase
{
protected override void OnStart(string[] args)
{
throw new InvalidOperationException(message);
}
}
调用线程代码
try
{
using (ServiceController controller = new ServiceController())
{
controller.ServiceName = objServiceConfig.ServiceName;
controller.Start();
System.Windows.Forms.Application.DoEvents();
//controller.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 15));
//controller.WaitForStatus(ServiceControllerStatus.Running);
//if (!string.IsNullOrEmpty(LogUtilities.ServiceOnStartException))
//{
// MessageBox.Show("Error with starting service : " + LogUtilities.ServiceOnStartException);
// LogUtilities.ServiceOnStartException = string.Empty;
//}
}
}
catch (System.InvalidOperationException InvOpExcep)
{
DisplayError(InvOpExcep.Message);
LogUtilities.DisplayMessage("Failed to start service. " + LogUtilities.ServiceOnStartException, InvOpExcep);
LogUtilities.ServiceOnStartException = string.Empty;
}
catch (Exception ex)
{
DisplayError(ex.Message);
LogUtilities.DisplayMessage("Failed to start service. " + LogUtilities.ServiceOnStartException, ex);
LogUtilities.ServiceOnStartException = string.Empty;
}
我在 onstart() 方法中检查应用程序许可,如果失败则抛出许可错误。我希望将其共享到我的调用线程,以便我可以在 DialogBox 中显示消息。如果我无法处理调用过程中的异常,关于如何执行此操作的任何想法。
将您的服务分成(至少)两个组件 - 一个以某种形式(例如远程处理、WCF 端点、REST 服务等)处理 IPC 的组件和(一个或多个)执行此操作的组件它的实际工作。
如果许可检查失败,请不要启动其他组件 - 但仍然启动提供 IPC 的组件。在启动您的服务(现在至少应该始终启动)之后,您的基于表单的应用程序可以连接到该服务并(通过您想要的任何方式)确定该服务当前由于许可检查失败而拒绝提供任何功能。