3 回答
TA贡献2021条经验 获得超8个赞
像Ash一样,我将所有实际的处理代码编写在单独的类库程序集中,然后由Windows Service可执行文件以及控制台应用程序引用。
但是,有时候了解类库是否在服务可执行文件或控制台应用程序的上下文中运行很有用。我这样做的方法是反思托管应用程序的基类。(对VB表示抱歉,但是我认为可以很容易地对C#进行以下修饰):
Public Class ExecutionContext
''' <summary>
''' Gets a value indicating whether the application is a windows service.
''' </summary>
''' <value>
''' <c>true</c> if this instance is service; otherwise, <c>false</c>.
''' </value>
Public Shared ReadOnly Property IsService() As Boolean
Get
' Determining whether or not the host application is a service is
' an expensive operation (it uses reflection), so we cache the
' result of the first call to this method so that we don't have to
' recalculate it every call.
' If we have not already determined whether or not the application
' is running as a service...
If IsNothing(_isService) Then
' Get details of the host assembly.
Dim entryAssembly As Reflection.Assembly = Reflection.Assembly.GetEntryAssembly
' Get the method that was called to enter the host assembly.
Dim entryPoint As System.Reflection.MethodInfo = entryAssembly.EntryPoint
' If the base type of the host assembly inherits from the
' "ServiceBase" class, it must be a windows service. We store
' the result ready for the next caller of this method.
_isService = (entryPoint.ReflectedType.BaseType.FullName = "System.ServiceProcess.ServiceBase")
End If
' Return the cached result.
Return CBool(_isService)
End Get
End Property
Private Shared _isService As Nullable(Of Boolean) = Nothing
#End Region
End Class
TA贡献1851条经验 获得超5个赞
什么对我有用:
进行实际服务工作的类在单独的线程中运行。
此线程从OnStart()方法内部启动,并从OnStop()停止。
服务和控制台模式之间的决定取决于 Environment.UserInteractive
样例代码:
class MyService : ServiceBase
{
private static void Main()
{
if (Environment.UserInteractive)
{
startWorkerThread();
Console.WriteLine ("====== Press ENTER to stop threads ======");
Console.ReadLine();
stopWorkerThread() ;
Console.WriteLine ("====== Press ENTER to quit ======");
Console.ReadLine();
}
else
{
Run (this) ;
}
}
protected override void OnStart(string[] args)
{
startWorkerThread();
}
protected override void OnStop()
{
stopWorkerThread() ;
}
}
- 3 回答
- 0 关注
- 552 浏览
添加回答
举报