1

我试图让 Windows 服务一直在我的计算机后台运行,但没人知道。我的 Windows 服务会下载我的电子邮件收件箱的内容并将其放入我的数据库中。

我的 Windows 服务刚刚停止 - 它每 60 秒输入一次日志,然后在大约 10 分钟后停止?

我在下面发布了我的代码。任何人都可以看到或告诉我原因吗?

任何帮助将非常感激。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Timers;

namespace EmailWindowsService
{
    public partial class MyEmailService : ServiceBase
    {
        private DateTime lastRun;
        private bool flag = true;
        private static System.Timers.Timer aTimer;
        public MyEmailService()
        {
            InitializeComponent();
            if (!System.Diagnostics.EventLog.SourceExists("MySource")) // every thing the windows service does is logged in server explorer
            {
                System.Diagnostics.EventLog.CreateEventSource(
                    "MySource", "MyNewLog");
            }
            eventLogEmail.Source = "MySource";
            eventLogEmail.Log = "MyNewLog";

            // Timer Code
             aTimer = new System.Timers.Timer(1 * 60 * 1000); // 60 seconds
             aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
             aTimer.Enabled = true;
            // Timer Code
        }

        protected override void OnStart(string[] args)
        {
            flag = true;
            lastRun = DateTime.Now;
            eventLogEmail.WriteEntry("Started");
        }

        protected override void OnStop()
        {
            eventLogEmail.WriteEntry("Stopped");
        }
        protected override void OnPause()
        {
            eventLogEmail.WriteEntry("Paused");
        }
        protected override void OnContinue()
        {    
            eventLogEmail.WriteEntry("Continuing");
        }
        protected override void OnShutdown()
        {
            eventLogEmail.WriteEntry("ShutDowned");
        }

        private void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            RetriveEmailClass Emails = new RetriveEmailClass();
            if (flag == true)
            {
                eventLogEmail.WriteEntry("In getting Email Method");
                Emails.ServiceEmailMethod();
                lastRun = DateTime.Now;
                flag = false;
            }
            else if (flag == false)
            {
                if (lastRun.Date < DateTime.Now.Date)
                {
                    Emails.ServiceEmailMethod();
                    eventLogEmail.WriteEntry("In getting Email Method");
                }
            }
        }       
        }
    }
4

4 回答 4

0

确保您的课程没有错误,那里的错误可能会使您整个服务退出。还可以尝试将您的计时器放入一个方法中并且只调用它,而不是在您的服务代码中使用它。

Windows 服务应始终作为只调用方法的空壳。

于 2012-05-11T08:44:24.433 回答
0

您很可能有未处理的异常。自从你使用它就被隐藏了System.Timers.Timer。该计时器会吃掉所有未处理的异常,而不是让它们使您的应用程序崩溃。

这意味着您的应用程序可能看起来运行良好,但实际上并非如此。计时器回调中的 try/catch 将证明这一点。

我建议您改用System.Threading.Timer它,因为它不能以这种方式工作。

于 2012-05-11T08:49:51.217 回答
0

Windows 服务停止运行的几个原因。

1. Unhandled exception in your code. Looking from you code snippet, please add exception handling in the OnTimedEvent() method.
2. You service may crashed for some reason. In this case, you can go to event viewer to find out the reason for the failure. 

希望这可以帮助。

于 2012-05-08T14:24:55.113 回答
-1

除了 Emails.ServiceEmailMethod 方法的源代码之外,您的代码非常简单。该方法是否产生任何异常?如果是这样,它们并没有被困在您的计时器方法中。尝试:

try { Emails.ServiceEmailMethod(); }  
catch (Exception ex) { eventLogEmail.WriteEntry(ex.Message); }
于 2012-05-08T14:23:38.677 回答