У меня есть таймер, который каждые 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);
}
В принципе, вы хотите вывести логику из другого события в отдельный метод, а затем вызвать этот метод там, где вам это нужно.
Я изменил ваш 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());
}
}
Аргументом для конструктора 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);
}