发送大量短信时,批量短信应用程序挂起
Bulk SMS application hang when sent for many SMS
我已经使用 GsmComm 库、Oracle 数据库和 Devexpress[=25= 创建了群发短信的简单应用程序].我发送了很多消息(超过 25 条消息)我的应用程序挂起。我认为是因为过程太多。该场景,当用户发送消息时它将存储到数据库(OUTBOX table),然后用户单击发件箱表单上的按钮,如果消息发送成功它将存储到数据库(SENTMESSAGE table) 并在 OUTBOX table 中删除发送成功的消息。当消息正在处理发送用户无法点击另一个按钮或菜单,但发送完成后,应用程序再次正常,用户可以点击许多菜单。我读了一些文章,如果使用 Gammu 是可能的,因为它是第三方应用程序并且可以 运行 作为服务来发送和接收消息,但我需要它 gsmcomm 图书馆。
有关详细信息,这是我的代码:
//SEND BULK SMS MORE THAN 30 MESSAGE APPLICATION HANG
if (CommSetting.comm.IsConnected() == true)
{
int i;
for (i = 0; i < gridView1.DataRowCount; i++)
{
string pesan = gridView1.GetRowCellValue(i,"MESSAGE").ToString();
string ttd = lblTandaTangan.Text;
string msg = pesan + Environment.NewLine + Environment.NewLine + ttd; //SENT MESSAGE USING SIGNATURE
var listPhoneNumber = new List<string>();
listPhoneNumber.Add(gridView1.GetRowCellValue(i, "PHONENUMBER").ToString());
foreach (var phoneNumber in listPhoneNumber)
{
var pdu = new SmsSubmitPdu(msg, phoneNumber, string.Empty);
CommSetting.comm.SendMessage(pdu);
//---------------STORE TO ORACLE DB--------------------
if (koneksi_manual.con.State == ConnectionState.Open)
{
koneksi_manual.con.Close();
}
koneksi_manual.con.Open();
OracleCommand cmd = new OracleCommand();
cmd.CommandText = @"INSERT INTO MESSAGESENT (ID, DATE, TIME, PHONENUMBER, MESSAGE) VALUES
(SQ_MESSAGESENT.NEXTVAL, '" + DateTime.Now + "', TO_DATE('" + DateTime.Now + "', 'dd/MM/yyyy hh24:mi:ss'), '"
+ gridView1.GetRowCellValue(i, "PHONENUMBER") + "', '" + pesan.Replace("'", "''") + "', '" + Program.IDUser + "')";// <= Use gridView1.GetRowCellValue to get the cell value.
cmd.Connection = koneksi_manual.con;
cmd.ExecuteNonQuery();
//Sleeps system for 1000ms for refreshing GSM Modem
System.Threading.Thread.Sleep(1000);
//DELETE MESSAGE SENT FROM OUTBOX
var obj = gridView1.GetRowCellValue(i, "ID");
OracleCommand cmd2 = new OracleCommand();
cmd2.CommandText = "DELETE FROM OUTBOX WHERE ID = '" + obj + "'";
cmd2.Connection = koneksi_manual.con;
cmd2.ExecuteNonQuery();
}
MessageBox.Show("Message Sent", "Notif");
}
}
我希望用户在发送消息时能够单击我的应用程序中的另一个菜单。
我不知道如何解决这个问题,也许任何人都可以给我一个建议和任何概念,我将非常感激。
谢谢..
你好尝试在这里使用线程
Control.CheckForIllegalCrossThreadCalls = false;
Private Void BtnSend_Click(Object Sender,EventArg e)
{
Thread th = new Thread(new ThreadStart(SendMSM));
}
Private void SendMSM()
{
if (CommSetting.comm.IsConnected() == true)
{
int i;
for (i = 0; i < gridView1.DataRowCount; i++)
{
string pesan = gridView1.GetRowCellValue(i,"MESSAGE").ToString();
string ttd = lblTandaTangan.Text;
string msg = pesan + Environment.NewLine + Environment.NewLine + ttd; //SENT MESSAGE USING SIGNATURE
var listPhoneNumber = new List<string>();
listPhoneNumber.Add(gridView1.GetRowCellValue(i, "PHONENUMBER").ToString());
foreach (var phoneNumber in listPhoneNumber)
{
var pdu = new SmsSubmitPdu(msg, phoneNumber, string.Empty);
CommSetting.comm.SendMessage(pdu);
//---------------STORE TO ORACLE DB--------------------
if (koneksi_manual.con.State == ConnectionState.Open)
{
koneksi_manual.con.Close();
}
koneksi_manual.con.Open();
OracleCommand cmd = new OracleCommand();
cmd.CommandText = @"INSERT INTO MESSAGESENT (ID, DATE, TIME, PHONENUMBER, MESSAGE) VALUES
(SQ_MESSAGESENT.NEXTVAL, '" + DateTime.Now + "', TO_DATE('" + DateTime.Now + "', 'dd/MM/yyyy hh24:mi:ss'), '"
+ gridView1.GetRowCellValue(i, "PHONENUMBER") + "', '" + pesan.Replace("'", "''") + "', '" + Program.IDUser + "')";// <= Use gridView1.GetRowCellValue to get the cell value.
cmd.Connection = koneksi_manual.con;
cmd.ExecuteNonQuery();
//Sleeps system for 1000ms for refreshing GSM Modem
System.Threading.Thread.Sleep(1000);
//DELETE MESSAGE SENT FROM OUTBOX
var obj = gridView1.GetRowCellValue(i, "ID");
OracleCommand cmd2 = new OracleCommand();
cmd2.CommandText = "DELETE FROM OUTBOX WHERE ID = '" + obj + "'";
cmd2.Connection = koneksi_manual.con;
cmd2.ExecuteNonQuery();
}
MessageBox.Show("Message Sent", "Notif");
}
}
我同意 Tanmay 使用线程,但我也认为如果可能的话使用单个 table,即不要对发件箱或已发送的消息使用不同的 table,只需使用标志为了保持状态,这将减少 DB I/O
我已经使用 GsmComm 库、Oracle 数据库和 Devexpress[=25= 创建了群发短信的简单应用程序].我发送了很多消息(超过 25 条消息)我的应用程序挂起。我认为是因为过程太多。该场景,当用户发送消息时它将存储到数据库(OUTBOX table),然后用户单击发件箱表单上的按钮,如果消息发送成功它将存储到数据库(SENTMESSAGE table) 并在 OUTBOX table 中删除发送成功的消息。当消息正在处理发送用户无法点击另一个按钮或菜单,但发送完成后,应用程序再次正常,用户可以点击许多菜单。我读了一些文章,如果使用 Gammu 是可能的,因为它是第三方应用程序并且可以 运行 作为服务来发送和接收消息,但我需要它 gsmcomm 图书馆。
有关详细信息,这是我的代码:
//SEND BULK SMS MORE THAN 30 MESSAGE APPLICATION HANG
if (CommSetting.comm.IsConnected() == true)
{
int i;
for (i = 0; i < gridView1.DataRowCount; i++)
{
string pesan = gridView1.GetRowCellValue(i,"MESSAGE").ToString();
string ttd = lblTandaTangan.Text;
string msg = pesan + Environment.NewLine + Environment.NewLine + ttd; //SENT MESSAGE USING SIGNATURE
var listPhoneNumber = new List<string>();
listPhoneNumber.Add(gridView1.GetRowCellValue(i, "PHONENUMBER").ToString());
foreach (var phoneNumber in listPhoneNumber)
{
var pdu = new SmsSubmitPdu(msg, phoneNumber, string.Empty);
CommSetting.comm.SendMessage(pdu);
//---------------STORE TO ORACLE DB--------------------
if (koneksi_manual.con.State == ConnectionState.Open)
{
koneksi_manual.con.Close();
}
koneksi_manual.con.Open();
OracleCommand cmd = new OracleCommand();
cmd.CommandText = @"INSERT INTO MESSAGESENT (ID, DATE, TIME, PHONENUMBER, MESSAGE) VALUES
(SQ_MESSAGESENT.NEXTVAL, '" + DateTime.Now + "', TO_DATE('" + DateTime.Now + "', 'dd/MM/yyyy hh24:mi:ss'), '"
+ gridView1.GetRowCellValue(i, "PHONENUMBER") + "', '" + pesan.Replace("'", "''") + "', '" + Program.IDUser + "')";// <= Use gridView1.GetRowCellValue to get the cell value.
cmd.Connection = koneksi_manual.con;
cmd.ExecuteNonQuery();
//Sleeps system for 1000ms for refreshing GSM Modem
System.Threading.Thread.Sleep(1000);
//DELETE MESSAGE SENT FROM OUTBOX
var obj = gridView1.GetRowCellValue(i, "ID");
OracleCommand cmd2 = new OracleCommand();
cmd2.CommandText = "DELETE FROM OUTBOX WHERE ID = '" + obj + "'";
cmd2.Connection = koneksi_manual.con;
cmd2.ExecuteNonQuery();
}
MessageBox.Show("Message Sent", "Notif");
}
}
我希望用户在发送消息时能够单击我的应用程序中的另一个菜单。 我不知道如何解决这个问题,也许任何人都可以给我一个建议和任何概念,我将非常感激。 谢谢..
你好尝试在这里使用线程
Control.CheckForIllegalCrossThreadCalls = false;
Private Void BtnSend_Click(Object Sender,EventArg e)
{
Thread th = new Thread(new ThreadStart(SendMSM));
}
Private void SendMSM()
{
if (CommSetting.comm.IsConnected() == true)
{
int i;
for (i = 0; i < gridView1.DataRowCount; i++)
{
string pesan = gridView1.GetRowCellValue(i,"MESSAGE").ToString();
string ttd = lblTandaTangan.Text;
string msg = pesan + Environment.NewLine + Environment.NewLine + ttd; //SENT MESSAGE USING SIGNATURE
var listPhoneNumber = new List<string>();
listPhoneNumber.Add(gridView1.GetRowCellValue(i, "PHONENUMBER").ToString());
foreach (var phoneNumber in listPhoneNumber)
{
var pdu = new SmsSubmitPdu(msg, phoneNumber, string.Empty);
CommSetting.comm.SendMessage(pdu);
//---------------STORE TO ORACLE DB--------------------
if (koneksi_manual.con.State == ConnectionState.Open)
{
koneksi_manual.con.Close();
}
koneksi_manual.con.Open();
OracleCommand cmd = new OracleCommand();
cmd.CommandText = @"INSERT INTO MESSAGESENT (ID, DATE, TIME, PHONENUMBER, MESSAGE) VALUES
(SQ_MESSAGESENT.NEXTVAL, '" + DateTime.Now + "', TO_DATE('" + DateTime.Now + "', 'dd/MM/yyyy hh24:mi:ss'), '"
+ gridView1.GetRowCellValue(i, "PHONENUMBER") + "', '" + pesan.Replace("'", "''") + "', '" + Program.IDUser + "')";// <= Use gridView1.GetRowCellValue to get the cell value.
cmd.Connection = koneksi_manual.con;
cmd.ExecuteNonQuery();
//Sleeps system for 1000ms for refreshing GSM Modem
System.Threading.Thread.Sleep(1000);
//DELETE MESSAGE SENT FROM OUTBOX
var obj = gridView1.GetRowCellValue(i, "ID");
OracleCommand cmd2 = new OracleCommand();
cmd2.CommandText = "DELETE FROM OUTBOX WHERE ID = '" + obj + "'";
cmd2.Connection = koneksi_manual.con;
cmd2.ExecuteNonQuery();
}
MessageBox.Show("Message Sent", "Notif");
}
}
我同意 Tanmay 使用线程,但我也认为如果可能的话使用单个 table,即不要对发件箱或已发送的消息使用不同的 table,只需使用标志为了保持状态,这将减少 DB I/O