我即将开发一个控制台应用程序,它需要在特定时间持续运行和执行工作。
我的问题是让您的应用程序保持活力的最佳方法或实践是什么?
我的想法是:一个永无止境的循环?一个定时器,它会在需要时(在设定的睡眠期之后)休眠然后跳转到例行程序?
我会将应用程序编译成 exe,然后使用 AlwaysUp 将其作为服务运行。
问候..
彼得
我即将开发一个控制台应用程序,它需要在特定时间持续运行和执行工作。
我的问题是让您的应用程序保持活力的最佳方法或实践是什么?
我的想法是:一个永无止境的循环?一个定时器,它会在需要时(在设定的睡眠期之后)休眠然后跳转到例行程序?
我会将应用程序编译成 exe,然后使用 AlwaysUp 将其作为服务运行。
问候..
彼得
更好的解决方案是编写一个控制台应用程序来完成它的工作并退出。然后,您可以使用 Windows 任务计划程序定期运行它。
为什么不首先将您的应用程序构建为服务?
虽然您确实应该为此使用服务,但如果您需要/想要这样做,您可以使用 aManualResetEvent
来执行此操作:
private ManualResetEvent Wait = new ManualResetEvent(false);
当您完成“开始”并只想等待时,您将执行以下操作:
Wait.WaitOne();
当您想停止并让它退出时,您可以执行以下操作:
Wait.Set();
您可能不想只是在循环中旋转而不必要地消耗处理器时间。
假设您在 Windows 上,您应该有一个循环,该循环永远不会以调用 WaitForSingleObject() 或 WaitForMultipleObjects() 或 MsgWaitForMultipleObjects() 结束,具体取决于您的需要。然后有一些同步对象可以唤醒你,比如命名事件。
请参阅此处的 Win32 同步文档。如果您详细说明您的程序需要做什么,我们可能会提供更具体的建议。
您可以添加引用System.Windows.Forms
并调用System.Windows.Forms.Application.Run()
以开始标准应用程序消息循环。 Ctrl-C将终止应用程序。
另一种选择是用于Console.ReadKey()
暂停应用程序。喜欢Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();
这就是我在控制台应用程序中使用的,当它们只是坐在那里等待事件发生时。在任何一种情况下,应用程序都将继续运行并捕获触发事件(例如来自计时器、WCF、FileWatcher 等)。
如果您的程序将持续运行,那么您应该休眠直到所需的事件发生(例如 XX 秒过去)。如果您只是在 while {} 循环中旋转,您将占用 CPU 时间。
如果您的程序将始终在机器上运行,那么您应该考虑将其设置为服务,以便它与机器一起自动启动和停止。
好吧,我确定它应该在某个时候停止,不是吗?
如果您希望它也可以作为控制台应用程序运行,请生成一个可以工作的线程,并在 Console.ReadLine() 上设置主线程块。
如果您真的只想永远暂停主线程,只需阻止您永远不会触发的 ManualResetEvent。
但是,如果可以,请考虑使用服务。
如果您构建一个桌面应用程序,您会希望它在系统托盘中运行。这将
如果您构建一个服务器应用程序,您将需要编写一个 Windows 服务。这将
作为一个主要是 IT 专业人士的人,我会说我们获得的第 3 方应用程序作为控制台应用程序而不是 Windows 服务运行,我们付出了很多努力来防止被购买。它为我们创造了很多工作,并带来了重大的支持问题和安全漏洞。
发送线程休眠:System.Threading.Thread.Sleep(10000);
等待按键被按下: Console.WriteLine("Press any key to continue..."); Console.Read();
创建一个任务,然后等待它。
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...");
}
}
}