我在安装服务应用程序时遇到问题。当我运行我的调试模式时,一切正常,所有逻辑内容都有效。我之前已经编写了服务应用程序,并且比较了这两个服务应用程序之间没有什么区别。提前感谢您对我的代码的任何帮助:
class MainClass : ServiceBase
{
ABCSQLCon _SQLCon = new ABCSQLCon();
private int cycleTime = 0;
private delegate void processError(String errorMessage);
static void Main(string[] args)
{
#if(!DEBUG)
ServiceBase.Run(new MainClass());
#else
MainClass service = new MainClass();
service.OnStart(new string[0]);
#endif
}
protected override void OnStart(string[] args)
{
addToLog("Testing SQL Connection...", "Log");
cycleTime = _SQLCon.sleepTime;
addToLog("Sleep Time has been set...", "Log");
if (_SQLCon.testSQLConnection())
{
addToLog("Connection to SQL Database succeeded", "Log");
// queryThread();
//not neccessary to make applicated multithreaded yet.
addToLog("Starting Query Thread...", "Log");
ThreadStart queryCycle = new ThreadStart(queryThread);
Thread qThread = new Thread(queryCycle);
qThread.Start();
}
}
private void startProgram()
{
}
protected override void OnStop()
{
base.OnStop();
}
public MainClass()
{
this.ServiceName = "ABCSQL Engine";
}
啊我现在发现了问题,sql连接测试只是一个快速打开和关闭的工作,但我没有看到或意识到的是我在初始化_SQLCON对象的地方。 我已经把它移到我的方法,现在工作正常。快乐的日子,感谢答案,因为它帮助我看到我不看的地方。 X
答案 0 :(得分:2)
最好的做法是在不同的线程上调用方法然后调用服务线程以避免阻塞服务线程
public void MyMethod()
{
addToLog("Testing SQL Connection...", "Log");
cycleTime = _SQLCon.sleepTime;
addToLog("Sleep Time has been set...", "Log");
if (_SQLCon.testSQLConnection())
{
addToLog("Connection to SQL Database succeeded", "Log");
// queryThread();
//not neccessary to make applicated multithreaded yet.
addToLog("Starting Query Thread...", "Log");
ThreadStart queryCycle = new ThreadStart(queryThread);
Thread qThread = new Thread(queryCycle);
qThread.Start();
}
}
private Thread _myThread;
protected override void OnStart(string[] args)
{
ThreadStart threadStart = MyMethod;
_myThread = new Thread(threadStart);
_myThread.Start();
}
答案 1 :(得分:0)
问题是您正在初始化服务本身时建立数据库连接。
它在调试中工作,因为您实际上并未将其作为服务启动:
#if(!DEBUG)
ServiceBase.Run(new MainClass());
#else
MainClass service = new MainClass();
service.OnStart(new string[0]);
#endif
我怀疑启动方法需要很长时间,因为这一行:
if (_SQLCon.testSQLConnection())
您需要确保服务的start方法及时返回,并且任何可能长时间运行的进程都在一个线程中完成。如果您将此测试移动到一个线程中,那么您应该发现它正常工作。