有人可以让我知道如何从Windows服务(在C#中)运行长时间运行的进程吗?该过程可能需要几小时才能完成。该服务应检查数据库中是否有要执行的待执行作业。每项工作可以花费很长时间完成。如果没有挂起的作业,则应该休眠2分钟(可配置),然后重新开始。我如何使用Windows服务来做到这一点?提前致谢。如何在Windows服务中运行长时间运行的进程?
回答
- 创建一个新的“Windows服务”项目。
- 重写OnStart方法来创建一个线程。该线程将处理轮询和处理。
- 重写OnStop方法以设置标志。来自步骤2的线程监视这个标志并相应地终止它自己。
- 打开Service类的设计表面。在“属性”窗口的底部有一个名为“添加安装程序”的链接。点击它。
- 使用InstallUtil或将其放入安装程序包中来安装suervice。
我一直在写服务,所以随时问我后续问题。
没有什么特殊的技巧吧,除了你不能使用任何GUI /窗体或用户输入。根据定义,Windows服务没有用户I/O。将错误写入事件日志,你很好。
这是一个更容易使用计划不是开发自己的应用程序的任务窗口,你应该给它一个尝试。
如果不工作,你期望的那样,作为周杰伦说话的方式,有没有招了,只记得有没有GUI。
此服务需要每两分钟唤醒一次,而我的公司IT策略不允许计划任务的睡眠时间少于10分钟。所以我不得不选择Windows服务选项。使用控制台应用程序会更容易,更易于调试。感谢回复 – RKP 2010-10-11 10:39:01
你必须创建控制台应用程序是这样的
static void Main(string[] args)
{
bool createdNew;
Mutex m = new Mutex(true, "YourBatchProcessor", out createdNew);
if (!createdNew)
{
Console.WriteLine("YourBatchProcesso is already running!");
return;
}
//your code goes here
}
和Gmoliv说创建计划任务比运行,每2分钟
,或者如果你想写窗口服务然后像
您的服务代码public class YourServrClass
{
private int numticks = 0;
private Timer _timer;
private bool _IsStarted;
private int Interval =2000; //ticks //2 sec.
#region Initializer
public YourServrClass()
{
InitializeComponent();
_timer = new Timer();
_timer.Interval = Interval;
_timer.Elapsed += new ElapsedEventHandler(this.Timer_Tick);
}
#endregion
#region Timer_Tick to process
private void Timer_Tick(object sender, System.Timers.ElapsedEventArgs e)
{
numticks++;
if (_IsStarted)
{
_timer.Stop();
//your code //ProcessYourData();
_timer.Start();
}
}
#endregion
protected override void OnStart(string[] args)
{
_IsStarted=true;
}
protected override void OnStop()
{
_IsStarted=false;
}
}
感谢您的回复。我通过使用Timer组件解决了它,但是我的代码有点不同。我在“OnStart”方法中启动计时器,在“OnStop”方法中停止计时器,并在“Elapsed”事件处理程序中停止计时器,在运行进程之前禁用计时器,并在进程结束后重新启用计时器。它现在有效。 – RKP 2010-10-11 10:52:42
- 1. 关闭Windows服务中的长时间运行进程
- 2. 长时间运行的进程超时和Windows服务(Python)
- 3. Windows服务器查杀长时间运行的PHP进程
- 4. 长时间运行Windows服务
- 5. 在aspx和windows服务中运行长时间的过程
- 6. 如何在长时间运行的进程上运行coverage.py?
- 7. 在特定时间运行windows服务
- 8. 从ASP.NET中查询长时间运行的Windows服务
- 9. aws codedeploy长时间运行的进程
- 10. 长时间运行的进程
- 11. 终止长时间运行的进程
- 12. JSF长时间运行的进程
- 13. 如何在winforms c中使用长时间运行的进程#
- 14. Android长时间运行活动/服务
- 15. Android长时间运行服务
- 16. 长时间运行ADK附件(服务?)
- 17. 在Windows机器上长时间运行PHP的后台进程
- 18. SignalR长时间运行进程
- 19. 在Elixir中异步运行长时间运行的任务
- 20. 特定时间后运行Windows服务
- 21. 从Windows服务处理长时间运行的操作
- 22. 如何让进程在远程Windows服务器上运行
- 23. 调用其他长时间运行的工作流服务的长时间运行的工作流服务
- 24. 在长时间运行的应用程序中运行并行任务
- 25. 如何保持长时间运行的Go程序,运行?
- 26. 在Gnu Screen会话中在服务器上运行长时间运行的进程是不是很糟糕?
- 27. 如何取消使用`concurrent.futures.ProcessPoolExecutor`运行的长时间运行的子进程?
- 28. Rails中的长时间运行任务
- 29. 如何显示长时间运行的Ansible任务的进度?
- 30. 使用LogOn长时间运行Windows服务用户
我其实不喜欢服务选项,因为它每隔两分钟就会一直敲击数据库,以检查是否有任何要执行的任务,并且在没有任何任务执行时浪费CPU时间。相反,我喜欢事件驱动的模型,只有当有待执行的作业时,进程才会被唤醒。我认为MSMQ是可能的,但我不熟悉它,需要了解如何使用它。谢谢回复。这个过程应该能够产生多个线程来节省执行多个挂起作业的时间。如果比平时花费的时间更长,还需要杀死该进程 – RKP 2010-10-11 10:49:12
有趣的是,您应该提及MSMQ。当有工作要做时,我确实有SQL Server发送MSMQ消息。然后通过服务观看队列。一旦遇到非常罕见的情况,我将失去一条MSMQ消息,但只有在几秒钟内发送成千上万条消息时才会发生。 – 2010-10-12 18:26:04