如何从Timer.Elapsed事件中触发另一个事件?

时间:2014-05-28 12:04:27

标签: c# timer sqlcommand

我有一个计时器,每隔5秒轮询一次GSM调制解调器收到的新SMS消息,获取消息的代码工作正常,但我想每隔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);

            }

2 个答案:

答案 0 :(得分:2)

基本上,您希望将逻辑从其他事件中分解为单独的方法,然后在您需要的任何地方调用该方法。

我修改了您的SQL查询以使用参数(更安全,更易于维护),并添加了一些using块,以便您在不再需要时自动关闭/处置连接。

此外,由于您在实例化if (poller.Interval) == 0课程时将时间间隔设置为5000毫秒,因此我不确定true如何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());
    }
}

答案 1 :(得分:0)

Timer构造函数的参数是间隔。由于你传递5000,你的if语句将永远不会成立。您需要设置elapsed事件以在触发计时器时调用该方法。您也不需要设置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);
}