私は基本的に、毎分データベースで注文をチェックし、これらの注文からPDFを生成し、それを電子メールで送信するWindowsサービスをC#で作成しました。
ロジックは私のテストなどで完全に機能します。
サービスを作成し、セットアッププロジェクトを使用してインストールすると、サービスmmcでサービスを開始すると、次のようになります。
エラー1053サービスは、開始要求または制御要求にタイムリーに応答しませんでした
私のOnStartメソッドは次のようになります。
protected override void OnStart(string[] args)
{
//writeToWindowsEventLog("Service started", EventLogEntryType.Information);
timer.Enabled = true;
}
基本的には、タイマーを有効にするだけです...そのため、プロセスを集中的に呼び出すことはありません。
どこがおかしいの?
スタートアップアカウントをローカルシステム、ネットワークサービスなどに設定しようとしましたが、何も機能しません!
編集:
ここに私のコードがあります:(processPurchaseOrdersはdbがクエリされ、pdfが生成されるメソッドなどです...)
public partial class PurchaseOrderDispatcher : ServiceBase
{
//this is the main timer of the service
private System.Timers.Timer timer;
public PurchaseOrderDispatcher()
{
InitializeComponent();
}
// The main entry point for the process
static void Main()
{
#if (!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new PurchaseOrderDispatcher() };
ServiceBase.Run(ServicesToRun);
#else //debug code
PurchaseOrderDispatcher service = new PurchaseOrderDispatcher();
service.processPurchaseOrders();
#endif
}
private void InitializeComponent()
{
this.CanPauseAndContinue = true;
this.ServiceName = "Crocus_PurchaseOrderGenerator";
}
private void InitTimer()
{
timer = new System.Timers.Timer();
//wire up the timer event
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
//set timer interval
var timeInSeconds = Convert.ToInt32(ConfigurationManager.AppSettings["TimerIntervalInSeconds"]);
timer.Interval = (timeInSeconds * 1000); // timer.Interval is in milliseconds, so times above by 1000
timer.Enabled = true;
}
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
components.Dispose();
base.Dispose(disposing);
}
protected override void OnStart(string[] args)
{
//instantiate timer
Thread t = new Thread(new ThreadStart(this.InitTimer));
t.Start();
}
protected override void OnStop()
{
//turn off the timer.
timer.Enabled = false;
}
protected override void OnPause()
{
timer.Enabled = false;
base.OnPause();
}
protected override void OnContinue()
{
timer.Enabled = true;
base.OnContinue();
}
protected void timer_Elapsed(object sender, ElapsedEventArgs e)
{
processPurchaseOrders();
}
}
[〜#〜] msdn [〜#〜] から:
"OnStartにある処理を実行するためにコンストラクターを使用しないでください。OnStartを使用してサービスのすべての初期化を処理します。コンストラクターは、サービスの実行時ではなく、アプリケーションの実行可能ファイルの実行時に呼び出されます。 OnStart。たとえば、続行すると、SCMが既にオブジェクトをメモリに保持しているため、コンストラクターは再度呼び出されません。OnStopがOnStartではなく、コンストラクターに割り当てられたリソースを解放する場合、必要なリソースは2回目に作成されません。サービスが呼び出されます。」
OnStart呼び出しでタイマーが初期化されていない場合、これは問題である可能性があります。また、タイマーのタイプをチェックし、System.Timers.Timer for Servicesであることを確認します。 ここ は、Windowsサービスでタイマーを設定する方法の例です。
// TODONT:スケジュールされたプロセスを実行するためだけにWindowsサービスを使用
私はあなたのコードを試しましたが、それは大丈夫のようです。唯一の違いは、タイマー値(Service1.cs)をハードコーディングすることでした。以下が機能しない場合はお知らせください。
Service1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Timers;
using System.Threading;
namespace WindowsServiceTest
{
public partial class Service1 : ServiceBase
{
private System.Timers.Timer timer;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
//instantiate timer
Thread t = new Thread(new ThreadStart(this.InitTimer));
t.Start();
}
protected override void OnStop()
{
timer.Enabled = false;
}
private void InitTimer()
{
timer = new System.Timers.Timer();
//wire up the timer event
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
//set timer interval
//var timeInSeconds = Convert.ToInt32(ConfigurationManager.AppSettings["TimerIntervalInSeconds"]);
double timeInSeconds = 3.0;
timer.Interval = (timeInSeconds * 1000);
// timer.Interval is in milliseconds, so times above by 1000
timer.Enabled = true;
}
protected void timer_Elapsed(object sender, ElapsedEventArgs e)
{
int timer_fired = 0;
}
}
}
Service1.Designer.cs
namespace WindowsServiceTest
{
partial class Service1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.ServiceName = "Service1";
this.CanPauseAndContinue = true;
}
#endregion
}
}
空のWindowsサービスプロジェクトを作成し、以下を追加して、installutil.exeを実行し、上記にアタッチして、イベントが発生しているかどうかを確認しました(実際に発生しました)。
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.ServiceProcess;
namespace WindowsServiceTest
{
[RunInstaller(true)]
public class MyServiceInstaller : System.Configuration.Install.Installer
{
public MyServiceInstaller()
{
ServiceProcessInstaller process = new ServiceProcessInstaller();
process.Account = ServiceAccount.LocalSystem;
ServiceInstaller serviceAdmin = new ServiceInstaller();
serviceAdmin.StartType = ServiceStartMode.Manual;
serviceAdmin.ServiceName = "Service1";
serviceAdmin.DisplayName = "Service1 Display Name";
Installers.Add(process);
Installers.Add(serviceAdmin);
}
}
}
私はちょうど同じ問題を抱えていました。
それは、デバッグモードでコンソールとして実行していたためでした-上記のコードのように
#if (!DEBUG)
#else //debug code
#endif
そして、私はそれをデバッグモードでコンパイルし、サービスをインストールしていました
リリースモードでコンパイルしたとき、期待どおりに動作しました
お役に立てれば
将来、他の誰かがこれに遭遇した場合、Windows Server 2012でWindowsサービスを開始しようとしたときに同じエラー1053を受け取りました。
問題は、サービスが.NETフレームワーク4.5.1を対象に開発されたが、Windows Server 2012インスタンスにはそのバージョンの.NETフレームワークがインストールされていないということでした。サービスをターゲット.NET 4.0にバックアップすると、エラーが修正されました。
コンストラクターが問題でした。コンストラクターは、欠落しているDLLについて例外をスローしている必要があります。
私の問題:インストーラーの作成に関する経験不足。依存DLLをインストールフォルダーにコピーしていません(プライマリプロジェクト出力を作成するときにリリースビルド構成を選択する必要がありました)。
サーバーコンソール(サーバールーム)に移動し、そこからサービスを開始します。リモートで動作しません。
また、.configファイルに余分な「>」文字があることが判明するまで、このエラーが発生していました。
そのため、コンピューターをパンチする前に、まず.configファイルを再確認してください;)
私の場合; .Net 3.5サービスをWindows 2012サーバーにインストールしようとしていました。サーバーに.Net 4.0フレームワークがインストールされました。
サービスのターゲットフレームワークを.Net 4.0に変更します。今では正常に動作します。
私は同じ問題を抱えていましたが、私の場合は、リリース時にインストーラーサービスを再構築しました。サービスを再度インストールして実行すると、問題なくサービスが実行を開始しました
私のような。 4.6.1では動作しません(同じメッセージが表示されます)。その後、4.5で試して問題なく動作します。
サービスを含むアセンブリから最初に実行されるのは、 Main methodです。そして、特別なアクション、またはそのようなアクションを少なくとも1つ実行する必要があります。
public static int Main()
{
Run(new System.ServiceProcess.ServiceBase[] { new YourServiceClass() });
}
これが、最初のサービスを作成するときに試行錯誤を繰り返した後に発見したものです。 VSは使用しませんでした。私はVSガイドを使用しました( ウォークスルー:コンポーネントデザイナーでのWindowsサービスアプリケーションの作成 )、私はむしろこれを使用する必要があります: C#サービスの作成手順:レッスンI 。
適切な「メイン」メソッドがないと、実行可能ファイルはすぐに終了し、システムは30秒のタイムアウトを超えたと報告します:)