2012-04-20 32 views
0

Windowsサービスが作成されており、そのためのインストーラが作成されています。それはインストールされ、起動されますが、その中に書いたコードは実行されません。実際にサービスウィンドウからサービスを開始すると、OnStart()関数は起動されません。 initializecomponent()も静的void main関数もありません。誰でも助けてくれます。Windowsサービスがインストールされていても動作していません

私が間違っていた箇所を教えてください。

ここにいくつかのコード行があります。 uは私が

public partial class iMArchiveService : ServiceBase 
{ 
    Boolean isArchiving = false; 

    public iMArchiveService() 
    { 
     MyException.CreateLog("iMArchiveService: Inside Constructor. Initializing Component"); 
     InitializeComponent(); 
     MyException.CreateLog("iMArchiveService: Component Initialized. Timer is set as: " + TimeMachine.Interval.ToString() + " milliseconds"); 
    } 

    protected void TimeMachine_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     try 
     { 
      MyException.CreateLog("iMArchiveService: Inside Tick Try. Value of isArchiving variable before condition is: " + isArchiving.ToString()); 
      if (!isArchiving) 
       isArchiving = new iM.OrderArchiving.ArchiveOrderXML().ArchiveOrderService(); 
      MyException.CreateLog("iMArchiveService: Inside Tick Try. Value of isArchiving variable after condition is: " + isArchiving.ToString()); 
     } 
     catch (Exception ex) 
     { 
      MyException.CreateLog("iMArchiveService: Inside Tick Catch :("); 
     } 
    } 

    protected override void OnStart(string[] args) 
    { 
     TimeMachine.Enabled = true; 
     MyException.CreateLog("iMArchiveService Started: " + DateTime.Now.ToString()); 
    } 

    protected override void OnStop() 
    { 
     TimeMachine.Enabled = false; 
     MyException.CreateLog("iMArchiveService Stopped: " + DateTime.Now.ToString()); 
    } 

} 
上記のコードは、サービスfile.csためである

を書かれているかのより多くを望むなら、私に知らせて

ここ

はここに私のプロジェクトのインストーラファイル

namespace iM.OrderArchivingService 
{ 
    [RunInstaller(true)] 
    public partial class ProjectInstaller : Installer 
    { 
     public ProjectInstaller() 
     { 
     InitializeComponent(); 
     } 
    } 
} 

あるInitializeComponenet機能です - ここ

private void InitializeComponent() 
    { 
     this.myServiceProcessInstaller = new System.ServiceProcess.ServiceProcessInstaller(); 
     this.myServiceInstaller = new System.ServiceProcess.ServiceInstaller(); 
     // 
     // myServiceProcessInstaller 
     // 
     this.myServiceProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem; 
     this.myServiceProcessInstaller.Installers.AddRange(new System.Configuration.Install.Installer[] { 
     this.myServiceInstaller}); 
     this.myServiceProcessInstaller.Password = null; 
     this.myServiceProcessInstaller.Username = null; 
     // 
     // myServiceInstaller 
     // 
     this.myServiceInstaller.ServiceName = "iMArchiveService"; 
     // 
     // ProjectInstaller 
     // 
     this.Installers.AddRange(new System.Configuration.Install.Installer[] { 
     this.myServiceProcessInstaller}); 

    } 

はProgram.csのは

0ファイルです
namespace iM.OrderArchivingService 
{ 
static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main(string[] args) 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] { new iMArchiveService() }; 
     ServiceBase.Run(ServicesToRun); 
    } 
} 
} 

私は初期化または開始時にログに記録するコードを書いていますが、ログは作成されていません。

編集:タイマー用

コード(タイムマシン)

private void InitializeComponent() 
    { 
     this.components = new System.ComponentModel.Container(); 
     this.TimeMachine = new System.Timers.Timer(3600000); 
     // 
     // TimeMachine 
     // 
     this.TimeMachine.Interval = 3600000; 
     this.TimeMachine.Elapsed += new System.Timers.ElapsedEventHandler(TimeMachine_Elapsed); 
     // 
     // iMArchiveService 
     // 
     this.ServiceName = "iMArchiveService"; 

    } 

のthnx

+0

TimeMachineタイマーの間隔はどのくらいですか? – Coder

+0

はタイマーコードを追加しましたが、atleastは最初にコード化したログを書き込むべきです。ログはまたそれのために書かれていません – 1Mayur

+0

私はそれがタイマーの問題ではないと推測します...さらにロギングは、それがprojectinstaller initialen componetet関数に到達するが、何を開始しなければならないのかを示していません。私は私の初期化関数が私のサービスベースクラスへの参照を持っている必要があることを意味する... – 1Mayur

答えて

1

このリンクを参照してください。そのタイマーは、WinFormsアプリケーションでのみ機能します。

あなたは、代わりに、System.Timers.Timer


の使用に切り替える必要があるタイマークラスの一般的な議論はSystem.Threading.Timerである:

System.Threading.Timerは、コールバックメソッドを使用して、シンプルで軽量なタイマーで、スレッドプールスレッドによって処理されます。 Windowsフォームでの使用はお勧めしません。その理由は、ユーザーインターフェイスのスレッドでコールバックが発生しないためです。 System.Windows.Forms.Timerは、Windowsフォームでの使用に適しています。 サーバーベースのタイマー機能については、イベントを発生させ、追加の機能を持つSystem.Timers.Timerの使用を検討することがあります。

(私の強調は、元の置き換え)

+0

この方法を試すことができます – 1Mayur

+0

試してもまだ成功しません – 1Mayur

1

、それはそれでイベントを発生しないことがあります、WindowsサービスでSystem.Windows.Forms.Timerを使用しないでください。 The Windows Forms Timer event is not raised in a Windows serviceを参照してください。

WindowsサービスではSystem.Timers.TimerまたはSystem.Threading.Timerのいずれかを使用してください。 Windows service and timerを参照してください。

+0

それはタイの問題ではありません。しかし、これは後で問題を引き起こしたので、それを修正しました。ありがとう – 1Mayur

0

Enabledプロパティを使用して問題が発生した場合に備えて、代わりにTimer.Start()メソッドとTimer.Stop()メソッドを使用してタイマーを開始および停止する必要があります。

インターバル期間は3,600,000で、3600秒または60分= 1時間です。 1時間が過ぎるまで何も起こりません。これはあなたが意図したものですか?

ところで、例のような間隔は、以下の読みあなたのコードが少し楽になります設定:

this.TimeMachine.Interval = 1 * 1000; // 1 Second 
this.TimeMachine.Interval = 60 * 1000; // 60 Seconds 
this.TimeMachine.Interval = 60 * 60 * 1000; // 1 hour 

たSystem.DiagnosticsにDebug.Writeline()メソッドを使用してみてください。デフォルトでは、MSVSの出力ウィンドウにメッセージが表示されます。また、例外も表示されます。

関連する問題