2012-12-10 53 views
4

我正在編寫一個應用程序,通過HTTP發送文本消息到Slooce Tech API。由於應用程序將不得不發送大量的文本消息,因此我正在嘗試優化其速度。加速HTTP發佈速度

下面的第二段代碼是我目前用來發送帖子的方法。我編寫了第一段代碼,並且忽略了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; 
    } 
+4

您不能忽略'Request.GetResponse()',因爲這實際上是發送您在Web請求中構建的數據。 –

+0

你應該在你的'GetResponse'代碼中放置'using'語句。這樣做你也可以省略你的Close語句。 – Matthew

+3

你應該並行地發送多個POST(即async/TPL/ThreadPool /任何...)以實現高吞吐量... – Yahia

回答

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,所以你的每個線程都不會被阻塞。但是,我從來沒有嘗試過這樣的例子,因此我覺得沒有資格舉一個例子。

你可能會試圖將線索的數量增加到某個不值得的數字,但避免誘惑。創建和管理線程的開銷很快就會趕上你。我不知道理想的號碼是什麼,但歡迎您進行實驗。

+0

很酷,謝謝。我正在使用的服務提供商理論上可以每秒處理80個HTTP請求。我會研究異步請求和多線程,因爲這似乎是我正在尋找的。感謝您的建議! – ijb109

+0

我正在努力添加此功能,如果它能正常工作,我會通知您。 – ijb109