1

GsmCommライブラリ、Oracleデータベース、およびDevexpressを使用して、SMS を一括送信する簡単なアプリケーションを作成しました。多数のメッセージ (25 を超えるメッセージ) に対してメッセージを送信しました。アプリケーションがハングしました。プロセスが多すぎるためだと思います。シナリオでは、ユーザーがメッセージを送信すると、データベース ( OUTBOXテーブル) に保存され、ユーザーは送信ボックス フォームのボタンをクリックします。メッセージの送信に成功すると、データベース ( SENTMESSAGEテーブル) に保存され、OUTBOXで送信が成功したメッセージが削除されます。テーブル。送信されたメッセージが処理されているとき、ユーザーは別のボタンやメニューをクリックできませんでしたが、送信が完了した後、アプリケーションは再び正常になり、ユーザーは多くのメニューをクリックできました。Gammuはサードパーティのアプリケーションであり、メッセージを送受信するサービスとして実行できるため、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");
  }
}

ユーザーがメッセージを送信しているときに、アプリケーションで別のメニューをクリックできるようにしたい。これを解決する方法がわかりません。おそらく誰かが提案やコンセプトを教えてくれます。本当に感謝しています。ありがとう..

4

2 に答える 2

3

こんにちは、ここでスレッドを使用してみてください

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");
      }
    }
于 2016-02-17T04:48:58.597 に答える