1

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

私が間違っていたところを教えてください。

ここにいくつかのコード行があります。私が書いたものをもっと知りたい場合はお知らせください

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ファイルです

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);
    }
}
}

ご覧のとおり、初期化または開始時にログに記録するコードを作成しました..しかし、ログは作成されていません。

編集:

タイマー(TimeMachine)のコード

    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

4

4 に答える 4

1

Windowsサービスでは使用しないでくださいSystem.Windows.Forms.Timer。イベントが発生しない可能性があります。WindowsフォームタイマーイベントがWindowsサービスで発生しないを参照してください。

System.Timers.TimerまたはSystem.Threading.TimerWindowsサービスで使用します。Windowsサービスとタイマーを参照してください。

于 2012-04-20T07:23:12.147 に答える
1

間違ったTimerクラスを使用しています - 手がかりは名前空間にあります: System.Windows.Forms.Timer。そのタイマーは、WinForms アプリケーションでのみ機能します。

代わりに、使用に切り替える必要がありますSystem.Timers.Timer


にタイマー クラスの一般的な説明がありますSystem.Threading.Timer

System.Threading.Timerコールバック メソッドを使用し、スレッド プール スレッドによって提供されるシンプルで軽量なタイマーです。ユーザー インターフェイス スレッドでコールバックが発生しないため、Windows フォームでの使用はお勧めしません。Windows FormsSystem.Windows.Forms.Timerで使用する場合は、より適切な選択です。サーバーベースのタイマー機能については、イベントを発生させ、追加機能を備えた の使用を検討してください。System.Timers.Timer

(私の強調はオリジナルに置き換わります)

于 2012-04-20T07:19:17.103 に答える
0

TimeMachine.Enable = True を確認し、タイマーのタイミングを設定しているかどうかを確認してください。

このリンクを参照してください

http://codesimplified.com/2010/12/31/creating-window-service-with-net-vs2008/

于 2012-04-20T06:45:40.443 に答える
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 の [出力] ウィンドウにメッセージが投稿されます。そこにも例外が表示されます。

于 2012-04-20T07:38:45.457 に答える