我即将开发一个控制台应用程序,需要在特定时间连续运行和执行工作。
我的问题是保持应用程序存活的最佳方法或实践是什么?
我的想法是: 一个永无止境的循环? 一个计时器,在需要时(在设定的睡眠期后)睡觉,然后跳到常规?
我将把应用程序编译成exe,然后使用AlwaysUp将其作为服务运行。
此致..
彼得
答案 0 :(得分:14)
更好的解决方案是编写一个可以完成工作并退出的控制台应用程序。然后,您可以使用Windows任务计划程序定期运行它。
答案 1 :(得分:8)
为什么不首先将您的应用程序构建为服务?
答案 2 :(得分:4)
虽然您真的应该使用服务,但如果您需要/想要这样做,您可以使用ManualResetEvent
来执行此操作:
private ManualResetEvent Wait = new ManualResetEvent(false);
当你完成“开始”并想等待时,你就会这样做:
Wait.WaitOne();
当你想停下来让它退出时,你可以这样做:
Wait.Set();
答案 3 :(得分:3)
你可能不想只是在循环中旋转而不必要地消耗处理器时间。
假设你在Windows上,你应该有一个循环,永远不会以调用WaitForSingleObject()或WaitForMultipleObjects()或MsgWaitForMultipleObjects()结束,具体取决于你的需要。然后有一些唤醒你的同步对象,例如命名事件。
请参阅Win32同步文档here。如果您详细说明您的计划需要做什么,我们可能会提供更具体的建议。
答案 4 :(得分:3)
您可以添加对System.Windows.Forms
的引用并调用System.Windows.Forms.Application.Run()
以开始标准应用程序消息循环。 Ctrl-C 将终止该应用。
另一种选择是使用Console.ReadKey()
暂停应用。与Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();
当我们坐在那里等待事件发生时,这就是我在我的控制台应用程序中使用的内容。在任何一种情况下,应用程序都将继续运行并捕获触发的事件(例如来自计时器,WCF,FileWatcher等)。
答案 5 :(得分:2)
答案 6 :(得分:2)
如果你的程序将继续运行,那么你应该睡觉直到发生所需的事件(例如XX秒过去)。如果你只是旋转一段时间{}循环,你就会吸收CPU时间。
如果您的程序将始终在计算机上运行,那么您应该考虑将其作为服务,以便它自动启动和停止在计算机上。
答案 7 :(得分:1)
嗯,我确定它应该停止,不是吗?
生成一个可行的线程,并且如果您希望它也可以作为控制台应用程序运行,则在Console.ReadLine()上具有主线程块。
如果你真的想永远暂停主线程,只需阻止你永远不会触发的ManualResetEvent。
但是,如果可以,请考虑使用服务。
答案 8 :(得分:1)
如果您构建桌面应用程序,则需要在系统托盘中运行它。这将
如果构建服务器应用程序,则需要编写Windows服务。这将
作为主要是IT专业人士的人,我会说我们得到的第三方应用程序作为控制台应用而不是Windows服务运行,我们付出了很多努力来避免购买。它为我们创造了很多工作,并且开辟了重要的支持问题和安全漏洞。
答案 9 :(得分:1)
发送线程进入睡眠状态: System.Threading.Thread.Sleep(10000);
等待按键被按下: Console.WriteLine(“按任意键继续...”); Console.Read();
答案 10 :(得分:0)
创建一个任务,然后等待它。
class Program
{
static void Main(string[] args)
{
var processTask = Process();
processTask.Wait();
}
private static async Task Process()
{
var isNotCancelled = true;
while (isNotCancelled)
{
//Polling time here
await Task.Delay(1000);
//TODO: Do work here and listen for cancel
Console.WriteLine("I did some work...");
}
}
}