- - PR -
サービス起動時のエラー
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-08-07 17:55
こんにちは、C#初心者です。
WinXP SP3 VS 2008 C# .NET Framework 2.0 で作成してます。 サーバアプリのプログラムでビルド後、プロセスのアタッチでデバッグしてます。 サービスに登録されたプログラムのサービス開始と選ぶと 「エラー1053: そのサービスは指定時間内に開始要求または制御要求に応答しませんでした。」 と起動できません。 VSが感知し、デバッグプログラムが開き、どうやらログ出力クラスで初期化に失敗しているようでした。 public static class Log { public static object lockObject = new object(); public static string LogDir = ""; public static void Write(string text) { if (Properties.Settings.Default.LogMode.ToLower() != "on") {//←ここ! return; } WriteImpl(text); } private static void WriteImpl(string text) { lock (Log.lockObject) { string LogFileName = System.IO.Path.Combine(Log.LogDir , DateTime.Now.ToString("yyyyMMdd") + ".log"); StreamWriter sw = null; while (true) { try { sw = new StreamWriter(new FileStream(LogFileName , FileMode.Append , FileAccess.Write , FileShare.ReadWrite)); break; } catch (IOException) { //Thread.Sleep(100); break; } catch (Exception e) { throw e; } } sw.WriteLine(DateTime.Now.ToString() + "(" + Thread.CurrentThread.ManagedThreadId + "): " + text); sw.Close(); } } エラー内容から、nullの場合のロジックも書かないとExceptionで捕まえられませんよ。とのエラーと判断し、 Properties.Settings.Default.LogMode.ToLower() をtry catchで捕まえたり、stringで取得しようとしましたが、同じエラーでサービスを起動できないままです。 何から手を付けて良いか分からず、アドバイスよろしくお願いします。 ちなみにここは設定ファイルの値を取得していると思うのですが、ちゃんと値はセットされてます。 <setting name="LogMode" serializeAs="String"> <value>on</value> </setting> また、以前もこのようにソースを代えてリビルドをし、サービスを起動しようとしたら同じようにエラーになりました。所が数時間たって再びサービスを起動したら何事も無く実行されました・・。 [ メッセージ編集済み 編集者: 未記入 編集日時 2008-08-07 17:57 ] | ||||||||||||
|
投稿日時: 2008-08-08 10:46
このエラー内容から、
どうしてこの判断になったのでしょうか? どれが null か検証したのでしょうか?
null であれば System.String で ToLower メソッドは実行できません。 if (Properties.Settings.Default.LogMode == null) { // null の時の処理 } _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2008-08-08 13:02
このエラー、ServiceBase.OnStartメソッドが規定時間内に終了しなかった場合に発生します。規定時間は確か30秒位だったと思いますが、うろおぼえです、あしからず。
まずはServiceBase.OnStartで呼び出している処理の中で、どこに時間が掛かっているのか調査してはいかがでしょうか? イベントログかファイルに、 処理1開始:XX年XX月XX日 XX時XX分XX秒XXX 処理2開始:XX年XX月XX日 XX時XX分XX秒XXX ... みたいな感じで出力すれば、遅い処理は特定できると思います。 対策はケースバイケースですが、遅い処理をどうしてもOnStartで実施する必要があるなら、別スレッドで実施して、スレッドで例外になったらプロセスを終了する必要があるかもしれませんね。 |
1