2012-02-17 15 views
1

私はSMSを加入者に送る以下のコードを持っています。しかし、一度に送信するSMSが多すぎるため、一部のSMSがSMSGatewayから拒否されました。だから私はその間に遅れを取ることを考えている。このようなSMSの発送私のコードでthread.sleepやtimerを使うべきでしょうか?

- より良い、それのモデルwaiting側面ので、私は、スレッドとタイマー

答えて

2

これは、アプリケーションのアーキテクチャによって異なります。

ユーザーインターフェイスを持たないサービススタイルのアプリケーションで、データをデータベースから取り出してSMSに送信すると仮定すると、Thread.Sleep(...)は問題ありません。

このアプリケーションにユーザーインターフェイスがあり、このSMSがUIスレッドでコードを送信している場合、Thread.Sleep(...)はUIをブロックします。実際には、この場合、smsSender.sendSMSは既にあなたのUIをブロックしています!

このコードがUIスレッドから外れるようにリファクタリングするのがその答えです。結果セットがローカルオブジェクトにキャッシュされ、タイマーが一度に1つのSMSを送信するセットを反復するように、コードをリファクタリングする必要がありますが、タイマーを使用するだけで簡単に行うことができます。

どちらの場合でも、SMSを送信している間はデータベースをロックしないことをお勧めします。

+0

+1 _ "あなたがSMSを送信している間にデータベースにロックを持たないことを望みます。" - いいえ、OPは定義上、メモリ内にあるDataTableのDataRowをループしているようです。 –

+0

Thread.Sleep()は、あなたが想定していた唯一のサービススタイルのアプリケーションから試してみます。 –

0

Thread.Sleep経験がないので

  foreach (DataRow row in dt.Rows) 
      { 
       //Gets Subscriber number 
       smsSender.destinationNum = Convert.ToInt64(row["callerID"]); 
       foreach (DataRow articleRow in dtArticle.Rows) 
       { 
        //Gets SMS content 
        smsSender.smsMessage = articleRow["news"].ToString(); 
        //Then send out the SMS 
        smsSendder.sendSMS(); 
       } 
      } 

してくださいアドバイスは、より適切です。

0

サーバーが要求を拒否するのを防ぐために、SMSゲートウェイへの呼び出しを遅延させるには、Thread.Sleep()を使用するのが適切です。

私はそれがCPUを縛っているThread.Sleep()だとは思わない。

2

あなたの質問にはタグが付いていると思うので、要求時にユーザーが「送信」ボタンなどのHTMLフォームを押したときにSMSメッセージを送信します。 。

この場合、複数のユーザーが同時にWebページを要求できます。また、ユーザーにWebページを提供するスレッドでスリープ状態にしたくない場合もあります。そうすると、SMSメッセージが送信されている間にWebページが応答するのをユーザーが待つ遅延が発生します。

私はこのような何かを示唆している:あなたは、データベース内のテーブルにメッセージを格納SMSメッセージを送信する必要がある場合

  • を。
  • 新しいメッセージをデータベースに格納した後、データベース内のSMSメッセージを処理するタスク(Task.Factory.StartNew)を開始します。
  • ASP.NETアプリケーションで複数のタスクが実行されていないことを確認する必要があります。新しいメッセージをデータベースに格納するには、タスクが実行中であるかどうか、またタスクが起動していないかどうかがチェックされます。
  • タスクは、データベース内の残りのメッセージをすべて処理し、適切な遅延を使用してメッセージを送信します(Thread.Sleeepによって完了)。
  • タスクがSMSメッセージを送信すると、タスクはデータベースから削除されます。

このソリューションは、アプリケーションプールがリサイクルされたとしてもメッセージを失うのを防ぐために、必要に応じて遅くなる可能性のあるバックグラウンドタスクへのメッセージの送信をオフロードします。

+0

ありがとうございますが、私の関与はユーザーのやりとりに関係しません。 –

関連する問題