4

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

1 回答 1

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 个线程将继续愉快地运行。

我相信您可能会对此有所改进,因为您要合并异步请求和 HTTPClient,因此您的 10 个线程中的每一个都不会被阻塞。但是,我觉得没有资格举一个例子,因为我从未尝试过。

您可能很想将线程数增加到某个不合理的数字,但要避免这种诱惑。创建和管理线程的开销很快就会赶上你。我不知道理想的数字是多少,但欢迎您尝试。

于 2012-12-10T22:41:11.897 回答