我有一个ASP .NET页面,允许用户启动程序。这些程序和参数存储在数据库中,然后Windows服务执行这些程序。 程序是实现我的IPlugin接口的dll,所以我可以在运行时添加它们(dll在运行时加载,所以我可以在运行时添加它们而无需编译或重新启动服务)。
我创建了ASP .NET页面,超过10个程序(插件)和Windows服务。一切都运行正常,但我认为Windows服务的实现很糟糕。
Windows服务会定期查询数据库,并在获取新条目时执行所需的程序。该服务可以并行运行多个程序(目前有3个程序)。
目前我的服务方法如下:
while (Alive)
{
// gets all running processes from the database
Processes = Proc.GetRunningProcs();
// if there are less than 3 processes running and
// a process is in queue
if (ReadyToRun())
{
// get next program from queue, sets the status to
// runnig and update the entry in the database
Proc.ProcData proc = GetNextProc();
proc.Status = Proc.ProcStatus.Running;
Proc.Update(proc);
// create a new thread and execute the program
Thread t = new Thread(new ParameterizedThreadStart(ExecuteProc));
t.IsBackground = true;
t.Start(proc);
}
Thread.Sleep(1000);
}
我有一个方法可以在数据库中查询状态为“正在取消”的条目(如果用户取消程序,状态将设置为“正在取消”)并执行Thread.Abort()。
有更好的做法吗?比如使用取消机制的任务或整个概念(将进程存储在数据库中(程序名称,参数,状态等,并定期查询此信息)是错误的?
答案 0 :(得分:0)
作为替代方案,您可以将一些现有库用于Quartz.NET http://www.quartz-scheduler.net/等目的。它关注工作持久性,作业调度和许多其他事情。您只需创建一个适配器并将其放入Windows服务。