将Windows服务实现为“工作者”的最佳方式

时间:2015-07-08 08:35:39

标签: c# asp.net .net windows-services

我有一个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()。

有更好的做法吗?比如使用取消机制的任务或整个概念(将进程存储在数据库中(程序名称,参数,状态等,并定期查询此信息)是错误的?

1 个答案:

答案 0 :(得分:0)

作为替代方案,您可以将一些现有库用于Quartz.NET http://www.quartz-scheduler.net/等目的。它关注工作持久性,作业调度和许多其他事情。您只需创建一个适配器并将其放入Windows服务。