我有一个计时器,每隔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);
}
答案 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);
}