Время истекает или целое число достигает указанного предела - как? (С #) - PullRequest
0 голосов
/ 01 октября 2010

Я использую программу на C # (консольное приложение, которое вскоре будет преобразовано в службу Windows), где мне нужно иметь возможность отправлять сообщения администраторам по электронной почте об ошибках в службе, но мне нужно, чтобы она не отправляла наши электронные письма каждому ошибка, если количество ошибок за последние несколько минут превышает 4-5, поэтому будет отправлено только одно электронное письмо с сообщением о множественных ошибках.

Я понимаю, что использовал бы таймер в некоторой форме, но кто-нибудь может предложить более конкретный совет? Я был бы очень благодарен

Ответы [ 3 ]

0 голосов
/ 01 октября 2010

Используйте сохранить ошибки в списке, затем используйте System.Threading.Timer .

Передайте делегат, который завершает метод SendEmail.

0 голосов
/ 01 октября 2010

Модифицировано из MSDN.Обратите внимание на комментарии об объявлении и очистке Timer объекта aTimer.

using System;
using System.Timers;
using System.Threading;

public class Timer2
{
    private static System.Timers.Timer aTimer;
    private static List<string> errors = new List<string>();
    private static readonly int interval = 300000;  // 5 minutes at present
    private static readonly int trigger = 10;       // send msg if > 10 errors

    // Message processing - error detection
    public static void processMessage(Message message)
    {
      // do the work here
      // then check error
      if (message.HasError)
      {
        // add error to pending list
        lock (errors)
        {
          string newErrorData = "got another one!";
          errors.Add(newErrorData);
          ++trigger;
        }
      }
    }

    public static void Main()
    {
        // Normally, the timer is declared at the class level,
        // so that it stays in scope as long as it is needed.
        // If the timer is declared in a long-running method,  
        // KeepAlive must be used to prevent the JIT compiler 
        // from allowing aggressive garbage collection to occur 
        // before the method ends. (See end of method.)
        //System.Timers.Timer aTimer;

        // Create a timer with specified interval.
        aTimer = new System.Timers.Timer(interval);

        // Hook up the event handler for the Elapsed event.
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
        aTimer.Enabled = true;

        // Kick off message handling - don't forget to clean up the timer when 
        // you wish to exit
        while (moreMessages)
        {
           Message message = getNextmessage();
           ProcessMessage(message);
        }
        // cleanup here when messages are drained
        // If the timer is declared in a long-running method, use
        // KeepAlive to prevent garbage collection from occurring
        // before the method ends.
        //GC.KeepAlive(aTimer);        }

    private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    {
        object errorEmail = null;
        lock (errors)
        {
            if (errors.Count > trigger)
            {
               // init message to contain errors here
               errorEmail = new ErrorEmail();
               foreach (string err in errors)
               {
                  // add error info to message
               } 
               errors.Clear();
               trigger = 0;
            }
        }
        if (errorEmail != null)
        {
          // send message outside the lock
          Send(errorEmail);
        }
    }
}
0 голосов
/ 01 октября 2010

Если вы отслеживаете каждое электронное письмо, которое вы отправляете, используя базу данных, вы всегда можете опрашивать базу данных, чтобы увидеть, сколько электронных писем вы видели за данную ошибку за определенный период времени и т. Д. В тех немногих проектах, над которыми я работал, где электронная почта была обязательным требованием, регистрация отправленных электронных писем всегда была сестринским требованием, таким образом создавая решение вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...