c# - 加快 HTTP 发布速度

标签 c# optimization http-post

我正在编写一个应用程序,通过 HTTP post 将文本消息发送到 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;
    }

最佳答案

首先,我非常怀疑任何声称您将看到巨大改进的说法,因为您正在以一种特殊的方式制作您的 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 个线程中的每一个都不会阻塞。但是,我觉得没有资格举个例子,因为我从未尝试过。

您可能会试图将线程数增加到一些不合常理的数字,但要避免这种诱惑。创建和管理线程的开销很快就会 catch 你。我不知道理想的数字是多少,但欢迎您进行试验。

关于c# - 加快 HTTP 发布速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13809863/

相关文章:

C# - WPF - 在不使用 System.Windows.Forms 的情况下获取文件夹浏览器对话框?

c# - 错误 : Native images generated against multiple versions of assembly System.Net.Http.Primitives

c++ - 避免重复的 C++ 虚拟表查找

python - Python 中 MIP 求解器 OR 工具的搜索策略

database - 在 SQL Server 中优化索引以进行排名

c# - 检查 Url 是否以 "http"或 "https"开头,非安全 Url 是否可能以 "https"开头?

java - 使用 Apache http post 查询参数

c# - C# 中的数据网格访问

javascript - 通过$post发送html数据失败

c# - 根据从另一个组合框中选择的索引填充组合框