【问题标题】:Windows Services for Console application in C#.netC#.net 中控制台应用程序的 Windows 服务
【发布时间】:2012-02-09 18:03:58
【问题描述】:

我在 C# 中制作了一个用于电子邮件通知的控制台应用程序。 我可以将此控制台应用程序转换为窗口服务吗?

谢谢。

【问题讨论】:

  • asp.net 如何适用于这个问题?
  • 问题不清楚,Windows 服务将实现什么目的?控制台应用程序有什么作用?您的问题需要澄清。
  • 只需创建一个计划任务以不时运行它即可快速简便。为什么要提供全方位服务?
  • 正如其他人所指出的,这个问题根本不清楚。如果您对迄今为止收到的任何答案仍然不满意,请强烈考虑对其进行编辑,以提供有关您要解决的确切问题的更多详细信息。

标签: c# windows-services console-application


【解决方案1】:

在 Visual Studio 中,创建“Windows 服务”项目而不是“控制台应用程序”。查看为您生成的代码。将有一个 OnStart() 和 OnStop() 方法。这些是在您的服务启动和停止时将调用的方法。将您的代码放入这些方法中,您将拥有一个 Windows 服务。

【讨论】:

    【解决方案2】:

    与其他答案提出的一些建议相反,您可能无法使用 Windows 服务做您想做的事情。它无法显示您期望的“通知”,因为服务无法显示任何类型的用户界面。

    适当的解决方案是创建一个在后台运行且不显示任何窗口的常规应用程序。您不能使用控制台应用程序执行此操作(嗯,您可以,但我们不要使事情过于复杂),因为每次运行它时,都会显示控制台窗口。但是,如果您创建一个标准的 Windows 应用程序(Windows 窗体或 WPF 应用程序),那么就不要创建一个窗口,一切都会正常工作。

    您可能希望创建一个图标并将其放置在任务栏的通知区域中,该图标将在电子邮件到达时处理显示通知。如果您正在创建 WinForms 应用程序,可以使用 NotifyIcon component 轻松完成。

    类似的东西(警告,在没有编译器帮助的情况下编写!):

    static class Program
    {
       [STAThread]
       static void Main()
       {
          // Standard infrastructure code
          Application.EnableVisualStyles();
          Application.SetCompatibleTextRenderingDefault(false);
    
          // Create a context menu and add item(s) to it
          ContextMenu mnu = new ContextMenu();
          MenuItem mnuExit = new MenuItem("E&xit");
          mnu.MenuItems.Add(mnuExit);
          mnuExit.Click += mnuExit_Click);
    
          // Create the NotifyIcon
          NotifyIcon ni = new NotifyIcon();
          ni.Icon = new Icon(GetType(), "icon.ico");
          ni.Text = "Email Notifier";
          ni.ContextMenu = mnu;
          ni.Visible = true;
    
          // Run the application
          Application.Run();
    
          // Before exiting, remove the NotifyIcon from the taskbar
          ni.Visible = false;
       }
    
       private static void mnuExit_Click(object Sender, EventArgs e)
       {
          Application.Exit();
       }
    }
    

    【讨论】:

      【解决方案3】:

      当我这样做时,我在一个不认为自己是控制台应用程序的类中编写应用程序。我的意思是我不写信给控制台。我使用 log4net 将所有内容写入...只需登录到 Info。使用控制台应用程序调用应用程序类,在 app.config 中,您可以有一个用于控制台日志记录的附加程序......因此您可以获得控制台输出。在 Windows 服务中,对于 Info 级别的日志记录,这将只写入文件或根本不写入。重要的是要注意控制台应用程序和服务之间的区别......服务不是交互式的,您不能输入任何内容,因此您的应用程序必须考虑这一点。对于windows服务使用同一个类,但是使用windows服务项目来启动它。

      ApplicationLogic:拥有运行应用程序的所有逻辑。可以接受参数以使应用程序以它需要的方式运行,但不与控制台交互(可以,但这是糟糕的设计)。将所有内容写入日志记录(可能是 log4net)。

      ConsoleApp:是 ApplicationLogic 的包装器,可以提示用户所需的任何内容,可以提示输入并将其发送到 ApplicationLogic。如果您需要查看 ApplicationLogic 的输出,则有一个 log4net 控制台附加程序。

      WindowsService:是ApplicationLogic 的包装器。具有预先确定的逻辑以保持其循环并运行应用程序逻辑。记录到文件,没有控制台输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        • 1970-01-01
        • 2017-04-10
        相关资源
        最近更新 更多