필자가 작성한 응용 프로그램은 데이터베이스에 저장된 SMS 메시지를 보냅니다. 이 부분에서는 데이터베이스를 선택하고 대기중인 메시지를 HTTP 요청으로 보내는 Windows 서비스를 작성합니다.HTTP 요청을 보내기 위해 Windows 서비스 최적화
응용 프로그램이 SMS를 보내므로 속도가 중요합니다. 지금 당장은 약 15 건의 요청이 초당 전송됩니다. 지금은 응용 프로그램이 SMSMessages
을 만든 다음 동기화 된 대기열에 넣습니다. 큐에서 한 번에 20 개의 스레드를 실행하기 위해 멀티 스레딩을 사용합니다.
너무 많은 스레드를 실행하면 응용 프로그램이 실제로 초당 보낸 메시지 수를 줄였습니다.
내가 알아 내려고하는 것은 내가 요청을 보내는 것보다 더 빠른 방법이 있는지입니다. 내 스레드를 구성하는 더 좋은 방법이 있습니까? 아니면 응용 프로그램을 최적화하기 위해 스레드 풀링 또는 비동기 요청을 사용해야합니까?
주요 코드는 여기에 있습니다 :
여기 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;
}
대량의 메시지를 보낼 수있는 API가 가능하지 않습니까? –
대량 전송 방법이 있습니까? 그들은 그들의 API에 나열되어 있지 않습니다. – ijb109
이 busy busy는 불필요하다. (while (tasks.Any (t =>! t.IsCompleted)) {}'). 'Task.WaitAll'을 사용할 수 있습니다. –