ServiceBase.OnStart メソッド
アセンブリ: System.ServiceProcess (system.serviceprocess.dll 内)


OnStart を使用して、サービスが Start コマンドを受け取ったときに発生する処理を指定します。OnStart は、サービスの動作を指定するメソッドです。OnStart は、データを渡す方法として引数をとることができますが、この方法はほとんど使用されません。
![]() |
---|
OnStart で行う必要がある処理をコンストラクタを使用して実行しないでください。OnStart を使用して、サービスの初期化をすべて処理します。コンストラクタは、サービスが実行されているときではなく、アプリケーションの実行可能ファイルが実行されているときに、呼び出されます。実行可能ファイルは OnStart の前に実行されます。たとえば、継続する場合、オブジェクトは SCM で既にメモリに格納されているため、コンストラクタは再度呼び出されません。OnStop が OnStart に割り当てられたリソースではなく、コンストラクタに割り当てられたリソースを解放する場合は、2 度目にサービスを呼び出すときに、必要なリソースが再作成されません。 |
サービスのインストーラで StartType を設定すると、コンピュータの再起動時にサービスを設定できます。このような場合は、システムの起動時に OnStart が呼び出されます。
OnStart は、派生クラスでオーバーライドされます。サービスを有効に使用するには、OnStart と OnStop の両方をサービス クラスに実装する必要があります。

ServiceBase から派生したサービス クラスに対して OnStart メソッドを実装する例を次に示します。このコード例は、ServiceBase クラスのトピックで取り上げているコード例の一部分です。
' Start the service. Protected Overrides Sub OnStart(ByVal args() As String) Dim handle As IntPtr = Me.ServiceHandle myServiceStatus.currentState = Fix(State.SERVICE_START_PENDING) SetServiceStatus(handle, myServiceStatus) ' Start a separate thread that does the actual work. If workerThread Is Nothing OrElse (workerThread.ThreadState And System.Threading.ThreadState.Unstarted Or System.Threading.ThreadState.Stopped) <> 0 Then #If LOGEVENTS Then System.Diagnostics.EventLog.WriteEntry("SimpleService.OnStart", DateTime.Now.ToLongTimeString() + _ " - Starting the service worker thread.") #End If workerThread = New Thread(New ThreadStart(AddressOf ServiceWorkerMethod)) workerThread.Start() End If If Not (workerThread Is Nothing) Then #If LOGEVENTS Then System.Diagnostics.EventLog.WriteEntry("SimpleService.OnStart", DateTime.Now.ToLongTimeString() + _ " - Worker thread state = " + workerThread.ThreadState.ToString()) #End If End If myServiceStatus.currentState = Fix(State.SERVICE_RUNNING) SetServiceStatus(handle, myServiceStatus) End Sub 'OnStart
// Start the service. 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)) { #if LOGEVENTS EventLog.WriteEntry("SimpleService.OnStart", DateTime.Now.ToLongTimeString() + " - Starting the service worker thread."); #endif workerThread = new Thread(new ThreadStart(ServiceWorkerMethod)); workerThread.Start(); } if (workerThread != null) { #if LOGEVENTS EventLog.WriteEntry("SimpleService.OnStart", DateTime.Now.ToLongTimeString() + " - Worker thread state = " + workerThread.ThreadState.ToString()); #endif } myServiceStatus.currentState = (int)State.SERVICE_RUNNING; SetServiceStatus(handle, myServiceStatus); }
// Start the service. protected: virtual void OnStart( array<String^>^ ) override { // Start a separate thread that does the actual work. if ( (workerThread == nullptr) || ((workerThread->ThreadState & (System::Threading::ThreadState::Unstarted | System::Threading::ThreadState::Stopped)) != (System::Threading::ThreadState)0) ) { Trace::WriteLine( DateTime::Now.ToLongTimeString() + " - Starting the service worker thread.", "OnStart" ); workerThread = gcnew Thread( gcnew ThreadStart( this,&SimpleService::ServiceWorkerMethod ) ); workerThread->Start(); } if ( workerThread != nullptr ) { Trace::WriteLine( DateTime::Now.ToLongTimeString() + " - Worker thread state = " + workerThread->ThreadState.ToString(), "OnStart" ); } }


Windows 98, Windows 2000 SP4, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


ServiceBase クラス
ServiceBase メンバ
System.ServiceProcess 名前空間
OnContinue
OnPause
OnPowerEvent
OnShutdown
OnStop
OnCustomCommand
- ServiceBase.OnStart メソッドのページへのリンク