簡體   English   中英

安裝的Windows服務將無法啟動

[英]Installed Windows service will not start

好吧,我討厭被打擾,但這次是我。 我能夠將服務安裝得很好,因此效果很好。 當我啟動該服務時,它停止了,並且我沒有任何問題的詳細信息。 所以這是我的代碼:

using System;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.IO;
using System.ServiceProcess;
using System.Text.RegularExpressions;
using System.Threading;

namespace MyServiceImport
{

public partial class MyServiceData : ServiceBase
{
    private System.Timers.Timer _timer;
    private Double ReadTime = Convert.ToDouble(ConfigurationManager.AppSettings.Get("ReadTime")) * 1000 * 60;
    private DateTime _lastRun = DateTime.Now;
    Thread _thread;

    public MyServiceData()
    {
        InitializeComponent();
    }

    // These lines run when the service starts up
    protected override void OnStart(string[] args)
    {
        _timer = new System.Timers.Timer();
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        _timer.Enabled = true;
        _timer.Interval = ReadTime;
        _timer.Start();

        #region Write to Audit Log
        string Event = "Update Service";
        string DoneBy = "Automation User";
        string Information = "Update Service has Started.";
        string MyTimeStamp = DateTime.Now.ToString();

        SqlConnection conn = new SqlConnection(DBUtils.MyService_DBString);
        string writeit = "INSERT INTO MyService_Activities (Event, DoneBy, Information, TimeStamp) values(@Event, @DoneBy, @Information, @TimeStamp)";
        SqlCommand WriteLog = new SqlCommand(writeit, conn);
        conn.Open();
        WriteLog.Parameters.AddWithValue("Event", Event);
        WriteLog.Parameters.AddWithValue("DoneBy", DoneBy);
        WriteLog.Parameters.AddWithValue("Information", Information);
        WriteLog.Parameters.AddWithValue("TimeStamp", MyTimeStamp);
        WriteLog.ExecuteNonQuery();
        conn.Close();
        #endregion

    }

    // writes message into the activity log that the service has stopped.
    protected override void OnStop()
    {
        #region Write to Audit Log
        string Event = "Update Service";
        string DoneBy = "Automation User";
        string Information = "Update Service has Stopped.";
        string MyTimeStamp = DateTime.Now.ToString();

        SqlConnection conn = new SqlConnection(DBUtils.MyService_DBString);
        string writeit = "INSERT INTO MyService_Activities (Event, DoneBy, Information, TimeStamp) values(@Event, @DoneBy, @Information, @TimeStamp)";
        SqlCommand WriteLog = new SqlCommand(writeit, conn);
        conn.Open();
        WriteLog.Parameters.AddWithValue("Event", Event);
        WriteLog.Parameters.AddWithValue("DoneBy", DoneBy);
        WriteLog.Parameters.AddWithValue("Information", Information);
        WriteLog.Parameters.AddWithValue("TimeStamp", MyTimeStamp);
        WriteLog.ExecuteNonQuery();
        conn.Close();
        #endregion
    }

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        // set up connection string 
        string _csMyServiceDD = DBUtils.MyService_DBString;
        string DoImportNow = string.Empty, TaskDay = string.Empty, TaskStartTime = string.Empty, TaskEndTime = string.Empty;

        SqlConnection conn = new SqlConnection(_csMyServiceDD);
        // Get task variables from database for comparison
        string query = "SELECT TaskDay, TaskStartTime, TaskEndTime FROM MyService_TaskSchedule where TaskName = 'DoImport'";
        SqlCommand cmd1 = new SqlCommand(query, conn);
        // opens the connection to read
        conn.Open();
        SqlDataReader rdr1 = cmd1.ExecuteReader();
        while (rdr1.Read())
        {
            TaskDay = rdr1.GetValue(0).ToString();
            TaskStartTime = rdr1.GetValue(1).ToString();
            TaskEndTime = rdr1.GetValue(2).ToString();
        }
        // closing the connection
        conn.Close();

        // setting _lastRun variable to this moment.
        _lastRun = DateTime.Now;
        // stop the timer 
        _timer.Stop();
        try
        {
            // check if the current time is within the time range for this service task.
            if (DateTime.Now.DayOfWeek.ToString() == TaskDay && DateTime.Now > Convert.ToDateTime(TaskStartTime) && DateTime.Now < Convert.ToDateTime(TaskEndTime))
            {
                _thread = new Thread(new ThreadStart(ImportData));
                _thread.Name = "ImportData";
                _thread.Start();
            }
            // decide if there is something to do
            #region Write to Audit Log
            string Event = "Update Service";
            string DoneBy = "Automation User";
            string Information = "Update Service has started importing data.";
            string MyTimeStamp = DateTime.Now.ToString();

            string writeit = "INSERT INTO MyService_Activities (Event, DoneBy, Information, TimeStamp) values(@Event, @DoneBy, @Information, @TimeStamp)";
            SqlCommand WriteLog = new SqlCommand(writeit, conn);
            conn.Open();
            WriteLog.Parameters.AddWithValue("Event", Event);
            WriteLog.Parameters.AddWithValue("DoneBy", DoneBy);
            WriteLog.Parameters.AddWithValue("Information", Information);
            WriteLog.Parameters.AddWithValue("TimeStamp", MyTimeStamp);
            WriteLog.ExecuteNonQuery();
            conn.Close();
            #endregion
        }
        catch (Exception ex)
        {
            // Catch error and write to audit log
            #region Write to Audit Log
            string Event = "Update Service";
            string DoneBy = "Automation User";
            string Information = "Error occurred in Import - Message: " + ex.ToString() + "";
            string MyTimeStamp = DateTime.Now.ToString();

            string writeit = "INSERT INTO MyService_Activities (Event, DoneBy, Information, TimeStamp) values(@Event, @DoneBy, @Information, @TimeStamp)";
            SqlCommand WriteLog = new SqlCommand(writeit, conn);
            conn.Open();
            WriteLog.Parameters.AddWithValue("Event", Event);
            WriteLog.Parameters.AddWithValue("DoneBy", DoneBy);
            WriteLog.Parameters.AddWithValue("Information", Information);
            WriteLog.Parameters.AddWithValue("TimeStamp", MyTimeStamp);
            WriteLog.ExecuteNonQuery();
            conn.Close();
            #endregion
        }
        _timer.Start();
    }

您確定捕撈{}是否按預期工作? 我懷疑您沒有收到任何反饋,因為您的SQLConnection無法正常工作。 嘗試執行更簡單的日志記錄以排除它。

您的問題和標簽並沒有給我們太多幫助。 您正在使用C#嗎? 而且,我假設使用Visual Studio?

真正幫助我調試服務的是NLog

您通過NuGet安裝它,對於初學者來說很容易。 只是許多優秀教程之一。 我寫到普通的舊.txt文件。

基本上,您在整個代碼中都添加了一堆日志注釋,然后嘗試啟動服務。 當它失敗時,您打開日志.txt並查看最后寫入的內容是什么。 現在,您知道它在該日志行和您的下一個日志行之間失敗了。

在對NLog感到滿意之后,您甚至可以在代碼中放置一個全局的,未處理的錯誤捕獲器,並將Exception寫入NLog,這會將StackTrace寫入您的日志並為您提供更多詳細信息。 您必須將NLog.config文件設置為將Exception格式化為文本。

我重新編寫了整個內容,首先只是進行基本的服務啟動,然后將代碼添加到其中。 現在運作良好。 感謝大家的提示和指示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM