我正在编写一个应用程序,通过HTTP帖子向Slooce Tech API发送短信。因为应用程序必须发送大量的文本消息,我正在尝试优化其速度。
下面的第二段代码是我目前用来发送帖子的方法。我编写了第一段代码并省略了HTTPWebResponse
以试图让它更快。
问题是新方法实际上更慢,而不是花费0.25秒执行,它需要一秒或更长时间,有时会卡住。
有谁知道为什么会这样做或提高此应用程序的速度的其他提示?我添加了Request.Proxy=null
并加快了速度。
感谢。
修改后的代码是:
public void QuickSend()
{
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);
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();
}
以下是原始代码:
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);
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;
}
答案 0 :(得分:2)
首先,我对你将会看到大规模改进的任何说法持怀疑态度,因为你正在以特殊的方式制作你的HttpWebRequest
。像您这样的单线程请求的瓶颈将是网络延迟以及服务器的响应时间。 (也许他们在回复您的请求之前正在进行大量的服务器端处理。)
您正在发出阻止请求,这意味着您的CPU在等待响应时无所事事。
如果您想多线程化您的应用程序,您可以执行以下操作:
var tasks = new Task[10];
for (int i = 0; i < 10; i++)
{
tasks[i] = Task.Factory.StartNew(() =>
{
int messages_sent_by_one_task = 0;
while(messages_sent_by_one_task < 10)
{
QuickSend();
messages_sent_by_one_task++;
}
});
}
while (tasks.Any(t => !t.IsCompleted)) { } //wait for tasks to complete
这将产生10个任务,每个任务将发送10条消息。如果一个响应需要很长时间,其他9个线程将继续愉快地继续。
我相信你可能会改进,因为你是incorporate asynchronous requests and HTTPClient,所以你的10个线程中的每一个都没有被阻止。但是,我没有资格举一个例子,因为我从未尝试过这个。
您可能想要将线程数量调整到一些不合适的数字,但要避免诱惑。创建和管理线程的开销很快就会赶上你。我不知道理想的数字是多少,但欢迎您进行实验。