サーバーのいくつかの設定を監視するための Windows サービスを構築しました。かなりの数の WinForm および WPF アプリを開発しましたが、Windows サービスに関してはまったくの初心者です。そのため、msdn に頼ってチュートリアルに従いました簡単なサービスの作り方。これで、サービスを問題なくインストールして実行できるようになりましたが、Microsoft チュートリアルからいくつかの断片を切り取った場合のみ.
いくつかのテストの後、SetServiceStatus() の onstart メソッドでサービスがクラッシュするようです。
public partial class MyService: ServiceBase
{
private static ManualResetEvent pause = new ManualResetEvent(false);
[DllImport("ADVAPI32.DLL", EntryPoint = "SetServiceStatus")]
public static extern bool SetServiceStatus(IntPtr hServiceStatus, SERVICE_STATUS lpServiceStatus);
private SERVICE_STATUS myServiceStatus;
private Thread workerThread = null;
public MyService()
{
InitializeComponent();
CanPauseAndContinue = true;
CanHandleSessionChangeEvent = true;
ServiceName = "MyService";
}
static void Main()
{
// Load the service into memory.
System.ServiceProcess.ServiceBase.Run(MyService());
}
protected override void OnStart(string[] args)
{
IntPtr handle = this.ServiceHandle;
myServiceStatus.currentState = (int)State.SERVICE_START_PENDING;
**SetServiceStatus(handle, myServiceStatus);**
// Start a separate thread that does the actual work.
if ((workerThread == null) || ((workerThread.ThreadState & (System.Threading.ThreadState.Unstarted | System.Threading.ThreadState.Stopped)) != 0))
{
workerThread = new Thread(new ThreadStart(ServiceWorkerMethod));
workerThread.Start();
}
myServiceStatus.currentState = (int)State.SERVICE_RUNNING;
SetServiceStatus(handle, myServiceStatus);
}
}
行をコメントアウトすると、サービスが正常に実行されるようになりましたSetServiceStatus()
。なぜこれが失敗するのですか?これは権利の問題ですか、それともここでのポイントを完全に見逃していますか?