私はSMSを加入者に送る以下のコードを持っています。しかし、一度に送信するSMSが多すぎるため、一部のSMSがSMSGatewayから拒否されました。だから私はその間に遅れを取ることを考えている。このようなSMSの発送私のコードでthread.sleepやtimerを使うべきでしょうか?
- より良い、それのモデルwaiting
側面ので、私は、スレッドとタイマー
私はSMSを加入者に送る以下のコードを持っています。しかし、一度に送信するSMSが多すぎるため、一部のSMSがSMSGatewayから拒否されました。だから私はその間に遅れを取ることを考えている。このようなSMSの発送私のコードでthread.sleepやtimerを使うべきでしょうか?
- より良い、それのモデルwaiting
側面ので、私は、スレッドとタイマー
これは、アプリケーションのアーキテクチャによって異なります。
ユーザーインターフェイスを持たないサービススタイルのアプリケーションで、データをデータベースから取り出してSMSに送信すると仮定すると、Thread.Sleep(...)は問題ありません。
このアプリケーションにユーザーインターフェイスがあり、このSMSがUIスレッドでコードを送信している場合、Thread.Sleep(...)はUIをブロックします。実際には、この場合、smsSender.sendSMSは既にあなたのUIをブロックしています!
このコードがUIスレッドから外れるようにリファクタリングするのがその答えです。結果セットがローカルオブジェクトにキャッシュされ、タイマーが一度に1つのSMSを送信するセットを反復するように、コードをリファクタリングする必要がありますが、タイマーを使用するだけで簡単に行うことができます。
どちらの場合でも、SMSを送信している間はデータベースをロックしないことをお勧めします。
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();
}
}
してくださいアドバイスは、より適切です。
サーバーが要求を拒否するのを防ぐために、SMSゲートウェイへの呼び出しを遅延させるには、Thread.Sleep()を使用するのが適切です。
私はそれがCPUを縛っているThread.Sleep()だとは思わない。
あなたの質問にはタグが付いていると思うので、要求時にユーザーが「送信」ボタンなどのHTMLフォームを押したときにSMSメッセージを送信します。 。
この場合、複数のユーザーが同時にWebページを要求できます。また、ユーザーにWebページを提供するスレッドでスリープ状態にしたくない場合もあります。そうすると、SMSメッセージが送信されている間にWebページが応答するのをユーザーが待つ遅延が発生します。
私はこのような何かを示唆している:あなたは、データベース内のテーブルにメッセージを格納SMSメッセージを送信する必要がある場合
Task.Factory.StartNew
)を開始します。Thread.Sleeep
によって完了)。このソリューションは、アプリケーションプールがリサイクルされたとしてもメッセージを失うのを防ぐために、必要に応じて遅くなる可能性のあるバックグラウンドタスクへのメッセージの送信をオフロードします。
ありがとうございますが、私の関与はユーザーのやりとりに関係しません。 –
スレッドがスリープしているようです。 Thread.sleepが悪い理由については、http://blogs.msmvps.com/peterritchie/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program/を参照してください。
タイマーがより正確です.Table.Sleepは、指定した時間(OSが長時間スリープ状態になる可能性があります)の間、LEASTで待機することが保証されています。 。
+1 _ "あなたがSMSを送信している間にデータベースにロックを持たないことを望みます。" - いいえ、OPは定義上、メモリ内にあるDataTableのDataRowをループしているようです。 –
Thread.Sleep()は、あなたが想定していた唯一のサービススタイルのアプリケーションから試してみます。 –