Как я могу запустить другое событие из события Timer.Elapsed?

1

У меня есть таймер, который каждые 5 секунд проверяет новые SMS-сообщения, полученные GSM-модемом, код для получения сообщений работает нормально, однако я хочу постоянно проверять новые сообщения каждые 5 секунд.

Моя проблема заключается в том, что когда я пытаюсь запустить событие, которое уходит и собирает эти сообщения, из моего события Timer.Elapsed я получаю 9 ошибок, я вызвал обработчик событий, как и любой другой метод, и попытался передать соответствующие аргументы в, но по какой-то причине он не будет компилироваться!

Код ниже, любая помощь будет принята с благодарностью =]

Когда это работает, я намереваюсь параметризовать SqlCommand !!!

для таймера

 public void Pollback()
   {
       Timer poller = new Timer(5000);
       poller.Enabled = true;
       poller.Start();
       if (poller.Interval==0)
       {
           GsmPhone_MessageReceived(object sender, MessageReceivedEventArgs e);
       }
   }

для моего обработчика событий, который обрабатывает входящие сообщения от модема

public void GsmPhone_MessageReceived(object sender, MessageReceivedEventArgs e)
        {
            Log("Message Received");

            //var message = GSM.ReadMessage(4);
            //GSM.ReadMessage(4);
            //TcpClientChannel client = new TcpClientChannel();
            //ChannelServices.RegisterChannel(client, false);
            //string url = "192.168.100.67:2000";
            //ISmsSender smssender = (ISmsSender)Activator.GetObject(typeof(ISmsSender), url);

            try
            {

                SqlConnection Conn = new SqlConnection("Data Source=*********,****;Initial Catalog=******;User ID=********;Password=*******");
                SqlCommand com = new SqlCommand();
                com.Connection = Conn;
                Conn.Open();
                com.CommandText = ("INSERT INTO My_Table(ID,Message,Blacklist) VALUES(2,'"+GSM.ReadMessage(4).ToString()+"', 'Yes')");
                com.ExecuteNonQuery();
                Conn.Close();


            }
            catch (Exception ex)
            {
                var exception = ex.ToString();
                Log(exception);

            }
Теги:
timer
sqlcommand

2 ответа

2
Лучший ответ

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

Я изменил ваш SQL-запрос на использование параметров (более безопасный, более простой в обслуживании) и добавил некоторые using чтобы вы автоматически закрывали/удаляли соединение, когда оно вам больше не нужно.

Кроме того, я не уверен, что if (poller.Interval) == 0 может быть true, поскольку вы устанавливаете интервал до 5000 мс при создании экземпляра класса Timer. Если вы хотите называть этот блок кода, когда интервал истекает, вы можете вызвать его из события Elapsed.

public void Pollback()
{
    Timer poller = new Timer(5000);
    poller.Elapsed += (s, e) => InsertMessage();
    poller.Start();  // "Start()" sets "Enabled = true", so you don't need the other statement
}

public void GsmPhone_MessageReceived(object sender, MessageReceivedEventArgs e)
{
    InsertMessage();
}

private void InsertMessage()
{
    Log("Message Received");

    try
    {
        using (var conn = new SqlConnection("Data Source=*********,****;Initial Catalog=******;User ID=********;Password=*******"))
        {
            using (var com = new SqlCommand())
            {
                com.Connection = conn;
                conn.Open();
                com.CommandText = ("INSERT INTO My_Table(ID,Message,Blacklist) VALUES(2, @Message, 'Yes')");
                com.Parameters.AddWithValue("@Message", GSM.ReadMessage(4).ToString());
                com.ExecuteNonQuery();
            }
        }
    }
    catch (Exception ex)
    {
        Log(ex.ToString());
    }
}
  • 0
    Фантастический ответ, Грант, большое спасибо! И последнее, перед тем как пометить ответ, могу ли я просто вызвать InsertMessage для события Elapsed вместо использования оператора If, как описано выше?
  • 0
    @ user3661217 Абсолютно. Это имеет гораздо больше смысла на самом деле. Я думаю, что вижу, что вы пытались сделать сейчас, думая, что при срабатывании таймера «интервал» будет равен 0.
0

Аргументом для конструктора Timer является интервал. Поскольку вы проходите в 5000, ваше утверждение if никогда не будет правдой. Вы должны установить прошедшее событие для вызова метода при запуске таймера. Вам также не нужно устанавливать Enabled и вызывать Start(), так как Start() просто устанавливает Enabled в True. Для получения дополнительной информации обратитесь к документу: http://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

Чтобы вызвать два метода с одним событием, инициируйте событие одним обратным вызовом и вызовите этот метод двумя другими способами.

public void Pollback()
{
   Timer poller = new Timer(5000);
   poller.Elapsed = OnTimedEvent;
   poller.Enabled = true;
}

private void OnTimedEvent(Object source, ElapsedEventArgs e){
   GsmPhone_MessageReceived(source, e);
   secondMethod(source, e);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню