我有一个 C# 应用程序,它设计为使用 Windows 窗体运行,但现在需要作为计划任务运行。我遇到了这个问题,我认为这是因为它需要“无头”,因为它不应该有用户环境的概念。该程序已编写为无人值守运行,因为它有一个 /AUTO 参数,然后将从一些默认值运行,但仍显示导致问题的表单。
我环顾四周,我认为在这种情况下有一种方法可以抑制形式,但我找不到确切的方法。有谁知道我如何抑制表单并允许此应用程序运行?
我有一个 C# 应用程序,它设计为使用 Windows 窗体运行,但现在需要作为计划任务运行。我遇到了这个问题,我认为这是因为它需要“无头”,因为它不应该有用户环境的概念。该程序已编写为无人值守运行,因为它有一个 /AUTO 参数,然后将从一些默认值运行,但仍显示导致问题的表单。
我环顾四周,我认为在这种情况下有一种方法可以抑制形式,但我找不到确切的方法。有谁知道我如何抑制表单并允许此应用程序运行?
从您的 WinForms 应用程序中取出计划任务所需的逻辑并将其放入控制台应用程序中。如果您可以在两个地方重用逻辑,请将其移动到共享库中。
将您的应用程序转换为控制台模式,并选中任务计划程序的“常规”选项卡中的“隐藏”复选框。
这将帮助你
如果您仍想使用 WinForm 应用程序,请将其 ShowOnTaskbar 属性设置为 false。
并且很容易将您的 winform 应用程序转换为 winform one。只需转到项目属性并将输出类型更改为控制台。但是您需要对代码进行一些调整。
As far as I understood you, you do not need the Forms mode anymore, right?
If this is correct, I suggest implementing your application as service, e.g. a WCF service. It can permanently run and execute your business logic on a configured timer.
To make configuration of the timer easy and flexible, you could optionally imncorporate NCronTab. This allows you to schedule the task in a pattern as easy as 45 11 * * Friday
(=> "Run every Friday at 11:45 am")
您可以告诉任务与桌面交互,在这种情况下,显示的表单不是问题。只要您的应用程序会自行关闭,工作就会完成..
我做了一个基于表单的东西,然后想要一个计划任务,所以写了一个命令行前端调用基于表单的应用程序,然后将 2 个 exe 与 ilmerge 一起推送,这样它就不会混淆,因为它是一个便宜的黑客
如果您的代码编写正确,您可以做一个 exe 前端并使用与您的表单(或 dll)相同的类并以这种方式工作。
检查是否设置了 /AUTO 参数,然后根据是否设置。在 Program.cs 中更改它:
Application.Run(new Form1());
至
Application.Run();
这不会显示表格,您可以做任何其他您喜欢的事情。
这是我可以在没有看到你代码的情况下给你的最好的。跳它有帮助!