使用C#写windows实时服务时遇到的问题。

AuckyWang 2015-12-14 09:16:54
如题,使用C#编写windows服务实现下面的功能:
数据库中存在两张表TaskTable(保存用户提交的任务处理的请求,会不断有用户提出新的任务请求,已经处理的任务删除。)和表ResultTable(结果表,保存任务处理后的结果。)该服务程序不断从表TaskTable中获取任务,调用处理函数,保存处理结果到表ResultTable。
下面是 OnStart( string [] argvs )方法的伪代码:
protected override void OnStart(string[] args)
{
Start(); // 调用自定义的 Start() 方法
}

protected override void OnStop()
{
Log.WriteLog(@"ProcessTaskService stopped!"); // 这里只是调用自定义的方法简单记录日志。
}
public static void Start()
{
try
{
while (true)
{
DataTable dt = DbBaseCmd.GetListByProc("FetchTask"); // FetchTask 是获取任务的存储过程。该语句调用自定义的函数返回包含任务的datatable。

string stuID = dt.Rows[0]["stuID"].ToString();
string type = dt.Rows[0]["type"].ToString();
string sysID = dt.Rows[0]["sysID"].ToString();
string rawRes = dt.Rows[0]["rawRes"].ToString();

Task task = CreateTaskObj(stuID, type, sysID, rawRes); // 构建一个任务对象。
Thread th = new Thread(new ThreadStart(task.process)); // 多态 的调用相应的处理方法。
th.Start();
}
}
}
catch (Exception ex)
{
Log.WriteLog(ex.Message + " " + ex.Source);
}
}

问题是这样的:按照上面的程序,执行安装服务的操作都是正常的。但是在“计算机” > "管理" > "服务" 中找到相应的服务后,右键启动时,开始执行启动过程的进度条,会执行很长时间,最后报错。
但是服务在依旧存在于“计算机” > "管理" > "服务" 中,而且一直在执行 处理任务请求 的工作。右键该服务,不能启动,也不能停止。

我的尝试:后来分析一下,应该是上述代码中 while( true ) 的问题。修改为有限次循环就可以正常安装、启动、停止、卸载。且循环的次数越多,执行启动过程的进度条时间就越长。

我想请教:需求是需要实时检查数据库表 TaskTable的,如果用有限次的循环不能满足需求,求大神给个解决方案!!!
...全文
204 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
AuckyWang 2015-12-25
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
另外,我们通常只做一个“通用的windows服务”,它的工作特别简单,就是每隔几秒钟查询一下本地机器的进程,有没有需要执行的进程。一旦发现进程没有启动,就启动exe程序。 这样,你编写的其它业务程序,都可以按照Console程序来设计。(只不过不要直接在控制台上结束,而可以使用 Console.ReadLine 或者 waithandler.WaitOne(); 的方式阻塞,不让进程结束) 这样只要编写一个简单的“守护进程服务”,它用于按照配置文件来启动本地的其它Console程序。以后永远也不需要再开发其它形式的windows service程序了。
引用 3 楼 sp1234 的回复:
另外,我们通常只做一个“通用的windows服务”,它的工作特别简单,就是每隔几秒钟查询一下本地机器的进程,有没有需要执行的进程。一旦发现进程没有启动,就启动exe程序。 这样,你编写的其它业务程序,都可以按照Console程序来设计。(只不过不要直接在控制台上结束,而可以使用 Console.ReadLine 或者 waithandler.WaitOne(); 的方式阻塞,不让进程结束) 这样只要编写一个简单的“守护进程服务”,它用于按照配置文件来启动本地的其它Console程序。以后永远也不需要再开发其它形式的windows service程序了。
多谢!你说的思路我理解了。有个问题是:业务程序按照Console程序来设计的话,那么每次启动它不是都会弹出一个dos界面的窗口吗?而实际需要的程序只是要在后台运行一个服务,并不希望弹出一个dos界面的窗口,这个窗口要怎么关闭呢? 第一次写windows服务,请原谅小白的问题。多谢。
  • 打赏
  • 举报
回复
另外,我们通常只做一个“通用的windows服务”,它的工作特别简单,就是每隔几秒钟查询一下本地机器的进程,有没有需要执行的进程。一旦发现进程没有启动,就启动exe程序。 这样,你编写的其它业务程序,都可以按照Console程序来设计。(只不过不要直接在控制台上结束,而可以使用 Console.ReadLine 或者 waithandler.WaitOne(); 的方式阻塞,不让进程结束) 这样只要编写一个简单的“守护进程服务”,它用于按照配置文件来启动本地的其它Console程序。以后永远也不需要再开发其它形式的windows service程序了。
  • 打赏
  • 举报
回复
服务启动时,要求在很短时间以内(大概是5秒钟)必须完成。因此你可以在 OnStart 中启动一个定时器,让它在10毫秒之后才启动真正的Start 方法。这样不管你修改 Start 中的代码执行起来有多慢,至少不会影响服务启动。
AuckyWang 2015-12-22
  • 打赏
  • 举报
回复
找到方法了。 使用定时器 system.time.timer 定时获取任务,代替问题中的 无限循环,就可以解决上面提到的服务启动遇到的问题。

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧