加快HTTP Post Speed

时间:2012-12-10 21:50:00

标签: c# optimization http-post

我正在编写一个应用程序,通过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;
    }

1 个答案:

答案 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个线程中的每一个都没有被阻止。但是,我没有资格举一个例子,因为我从未尝试过这个。

您可能想要将线程数量调整到一些不合适的数字,但要避免诱惑。创建和管理线程的开销很快就会赶上你。我不知道理想的数字是多少,但欢迎您进行实验。