- - PR -
Windowsサービスで処理が実行されない
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-12-16 19:25
VB.netでWindowsサービスを作成してインストールしました。
ざっくりとした処理の概要としては ・サービス起動時にタイマーを5つ起動 ・タイマーによって起動される処理でテキストファイルの読み書き コンピュータの管理画面で作成したサービスが起動しているのは確認できたのですが OnStartに書いてある処理が動いた形跡がありません。(ログファイルにて確認) サービスとして作ったコードをWindowsアプリケーションに移して実行したところ タイマーが起動してその後の処理も起動しました。 サービスはDebugでビルド、プロジェクトのスタートアップはSub Main()です。 OnStartに書いたコードは以下の通りです。
Windowsサービスでのタイマーの使いかたはWindowsアプリケーションとは違うのでしょうか? それとも、根本的にWindowsサービスの作成方法で何か間違っているのでしょうか? | ||||||||||||
|
投稿日時: 2006-12-16 23:05
Windows.Forms の Tiemr は使っちゃ駄目です。 標準ライブラリには Timer が3つくらいあるはずですが、どの Timer を使ったのでしょうか? | ||||||||||||
|
投稿日時: 2006-12-17 00:13
渋木宏明さん。こんばんは。
System.Timers.Timerを使っています。 コードをWindowsアプリに移してテストした際にもSystem.Timers.Timerを使用して タイマーは起動しました。 | ||||||||||||
|
投稿日時: 2006-12-17 01:37
タイマーオブジェクトの生成と破棄のコーディングに問題はありませんか? System.Timers.Timer のサンプルコード http://msdn2.microsoft.com/ja-jp/library/system.timers.timer(VS.80).aspx ではタイマーオブジェクトがガーベージコレクションされないように GC.KeepAlive(aTimer); としていますが 、タイマーオブジェクトがガーベージコレクションの対象にならないように工夫していますか? Windowsサービスと、Windowsアプリケーションは実行するスレッドモードが 違うので(STAThread と MTAThread)Windowsアプリでは動いてWindowsサービスでは動かないという現象になっているのかもしれません。 また、サポート技術情報でこういうのがありました。 [BUG] Windows サービスで System.Timers.Timer クラスの Elapsed イベントが発生しない http://support.microsoft.com/kb/842793/ja また、System.Threading.Timer でも [FIX] .NET Framework ベースのアプリケーションで System.Threading.Timer クラスを使用すると、.NET Framework 1.1 SP1 でタイマ イベントが通知されないことがある http://support.microsoft.com/kb/900822/ ちなみに、私の場合はサービスでTimerイベントは使った事がありません。 いつもはループと Thread.Sleep() の組み合わせで定期的な処理を行っています。 5つのタイマーを使うと、数個のスレッドから同時アクセスされることを考慮した コーディングが必要となり、テストも大変だと思います。 機能的に独立した複数のスレッドを起動することはありますが、機能が密接に関連する 定期的な処理は1つのスレッドで順番に実行することでコーディングとテストが かなり簡略化されます。 | ||||||||||||
|
投稿日時: 2006-12-17 02:36
ガベージコレクションの対象になるかどうかは、考慮していませんでした。 考慮した作りにすることも選択肢の一つとして残しますが、 ちょうど、k_kazuさんが教えてくれた、以下のレポートを読んでいたところでした。
動かない原因はこのレポートと同じ原因なのかと考えていたところです。
たしかに、タイマーが5つあるのは現実的ではないような気はしてました。 Windosサービスの作成もタイマーを複数使ったプログラムの作成も今回が初めてだったので いまさら(締め切り間近(汗))になって、まずい気がしています(´ヘ`;) 今回のサービスはパソコンが起動しいる間は常に、タイマーで5つの処理をキックしているのですが ループと Thread.Sleep() を使う方法とは、具体的にどんな感じでしょうか? 無限ループを使うということですか? 例えば、何分おきにある処理をキックするサンプルコードを教えていただけますでしょうか? よろしくお願いします。 | ||||||||||||
|
投稿日時: 2006-12-20 09:54
Windowsサービスでのタイマー起動ですが
単純にタイマーの実装が間違っていただけで、正しく実装したらタイマー起動しました。 動かない時は、サービスプロジェクトに追加したモジュールでタイマーのインスタンスを作成していましたが サービスの『Private components As System.ComponentModel.IContainer』でタイマーインスタンスを作成するのが正解でした。
k_kazuさん、渋木宏明さん、ありがとうございました。 [ メッセージ編集済み 編集者: カウンター 編集日時 2006-12-20 10:04 ] |
1