我正在尝试简单的Windows服务它工作正常,直到没有与database.once连接我建立连接我的服务得到安装并启动成功,但无法正常工作,并没有得到停止。它抛出一个错误:“Windows无法停止本地计算机上的服务“。
以下是代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Timers;
using System.Data;
using System.Data.SqlClient;
namespace tgfservice4
{
public partial class tgfservice4 : ServiceBase
{
private static string con = "Data Source=ABC;Initial Catalog=ABC;User Id=ABC;Password=ABC";//ConfigurationManager.ConnectionStrings["ABCD"].ToString();
private SqlConnection sn = new SqlConnection(con);
private SqlCommand sm;
Timer timer = new Timer();
public tgfservice4()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
//add this line to text file during start of service
TraceService("start service");
//handle Elapsed event
timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
//This statement is used to set interval to 1 minute (= 60,000 milliseconds)
timer.Interval = 60000;
//enabling the timer
timer.Enabled = true;
}
protected override void OnStop()
{
timer.Enabled = false;
TraceService("stopping service");
}
private void OnElapsedTime(object source, ElapsedEventArgs e)
{
TraceService("Another entry at " + DateTime.Now);
}
private void TraceService(string content)
{
sn.Open();
// sm = new SqlCommand("Update_Table", sn);
// sm.CommandType = CommandType.StoredProcedure;
try
{
// sm.Parameters.AddWithValue("@value", "0");
// sm.ExecuteNonQuery();
}
catch
{
throw;
}
finally
{
sm.Dispose();
sn.Close();
sn.Dispose();
}
//set up a filestream
FileStream fs = new FileStream(@"d:\MeghaService.txt", FileMode.OpenOrCreate, FileAccess.Write);
//set up a streamwriter for adding text
StreamWriter sw = new StreamWriter(fs);
//find the end of the underlying filestream
sw.BaseStream.Seek(0, SeekOrigin.End);
//add the text
sw.WriteLine(content);
//add the text to the underlying filestream
sw.Flush();
//close the writer
sw.Close();
}
}
}
答案 0 :(得分:1)
我认为您的OnStop方法需要很长时间才能连接数据库并在该连接上进行操作。
一般来说,你应该在后台的另一个线程中进行繁重的操作。
通常,Windows服务中的OnStart和OnStop事件用于启动进程,耗时的进程将在子线程中执行它
如果启动时出现任何错误,那么服务可能会像这样。要首次亮相,您可以执行以下操作。
protected override void OnStart(string[] args)
{
System.Diagnostics.Debugger.Launch();
...
}
然后将visual studio附加到流程并调试问题。
您也可以查看事件查看器中的系统和应用程序日志。
计算机/服务器管理器 - >事件查看器 - > Windows日志 - >应用
答案 1 :(得分:0)
如果在OnStop中引发异常,则服务控制管理器将不会卸载您的服务。因此,如果您在连接到数据库时遇到问题,只需将其记录在事件日志中,而不会引发更多错误。此外,如果尚未打开连接,请勿尝试关闭连接。关闭连接后添加try catch。最重要的是,确保OnClose中没有任何东西爆炸。