【问题标题】:Bulk SMS application hang when sent for many SMS发送多条短信时,批量短信应用程序挂起
【发布时间】:2016-02-17 02:38:15
【问题描述】:

我使用 GsmComm 库、Oracle 数据库和 Devexpress 创建了用于批量发送短信的简单应用程序。我为我的应用程序挂起的许多消息(超过 25 条消息)发送了消息。我假设它是因为太多的过程。场景,当用户发送消息时,它将存储到数据库(OUTBOX表),然后用户点击发件箱表单上的按钮,如果消息发送成功,它将存储到数据库(SENTMESSAGE 表)并删除 OUTBOX 表中发送成功的消息。当消息正在处理发送的用户不能点击另一个按钮或菜单,但在它完成发送后,应用程序又恢复正常,用户可以点击多个菜单。我读了一些文章,如果使用 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");
  }
}

我希望用户能够在用户发送消息时单击我的应用程序中的另一个菜单。 我不知道如何解决这个问题,也许任何人都可以给我一个建议和任何概念,我将非常感激。 谢谢..

【问题讨论】:

    标签: c# winforms oracle11g devexpress gsmcomm


    【解决方案1】:

    你好尝试在这里使用线程

    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");
          }
        }
    

    【讨论】:

    • 我添加了Control.CheckForIllegalCrossThreadCalls = false;,但我的VS检测到这样的错误'System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls' is a property but is used like a type如何解决这个问题?
    • 在表单构造函数中添加这个不是必需的,如果它给你带来跨线程问题,那么这将是有用的
    • 在 btnSend Thread th = new Thread(new ThreadStart(SendMSM)); 中有一个实例变量 th 我应该如何处理该变量?
    • 感谢您的建议,但最后我在 vs 中使用了 backgrounworker 并解决了我的问题,..
    【解决方案2】:

    我同意 Tanmay,使用线程,但我也认为如果可能的话使用单表,即不要使用不同的表来发件箱或发送的消息,只需使用一个标志来保持状态,这将减少 DB I/哦

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-03
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多