私が書いているアプリケーションは、データベースに保存されているSMSメッセージを送信します。この部分では、選択したデータベースを調べて、待機中のメッセージをHTTP要求として送信するWindowsサービスを作成しています。
アプリケーションはSMSを送信しているため、速度が重要です。現在、1秒あたり約15件のリクエストしか送信されていません。現在、アプリケーションSMSMessages
はそれらを作成して同期キューに入れます。マルチスレッドを使用して、そのキューから一度に20スレッドを実行します。
実行するスレッドが多すぎると、アプリケーションが実際に1秒あたりに送信されるメッセージの数を遅くすることに気づきました。
私が理解しようとしているのは、リクエストを送信するために私が行っているよりも速い方法があるかどうかです。スレッドを整理するためのより良い方法はありますか、それともアプリケーションを最適化するためにスレッドプーリングまたは非同期リクエストを使用する必要がありますか?
メインコードはここにあります:
Queue Messages = new Queue();
DataRow[] Rows = dtSMSCombined.Select(); //Created from a datatable
foreach (DataRow Row in Rows)
{
... //Get information from the row.
SMSMessage oSMS = new SMSMessage(Keyword, Number, Message, MessageID);
Messages.Enqueue(oSMS);
}
Queue SyncedMessages = Queue.Synchronized(Messages);
var tasks = new Task[20];
for (int i = 0; i < 20; i++)
{
tasks[i] = Task.Factory.StartNew(() =>
{ //each thread will pull out new items from the queue as they finish
while (SyncedMessages.Count > 0)
{
Response = new XDocument();
SMSMessage oSMS = (SMSMessage)SyncedMessages.Dequeue();
if (oSMS.GetMessage() != null && oSMS.GetMessage() != string.Empty)
{
Response = oSMS.SendSMS();
}
string ResponseCode = (string)Response.Descendants("response").First();
if (ResponseCode == "ok")
{
oSMS.sResponseCode = ResponseCode;
oSMS.dCompleted = DateTime.Now;
}
else { }
oSMS.DTInsert();
}
});
}
while (tasks.Any(t => !t.IsCompleted)) { }
クラスのSendSMS()
メソッドは次のとおりです。SMSMessage
public XDocument SendSMS()
{
XML = "<message id=\""+ lMessageID +"\"><partnerpassword>" + PartnerPassword + "</partnerpassword><content>" + sMessage + "</content></message>";
URL = "http://sloocetech.net:****/spi-war/spi/" + PartnerID + "/" + sRecipient + "/" + Keyword + "/messages/mt";
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(URL);
Request.Proxy = null;
RequestBytes = System.Text.Encoding.ASCII.GetBytes(XML);
Request.Method = "POST";
Request.ContentType = "text/xml;charset=utf-8";
Request.ContentLength = RequestBytes.Length;
RequestStream = Request.GetRequestStream();
RequestStream.Write(RequestBytes, 0, RequestBytes.Length);
RequestStream.Close();
HttpWebResponse Resp = (HttpWebResponse)Request.GetResponse();
oReader = new StreamReader(Resp.GetResponseStream(), System.Text.Encoding.Default);
string backstr = oReader.ReadToEnd();
oReader.Close();
Resp.Close();
Doc = XDocument.Parse(backstr);
return Doc;
}