4

HTTP 投稿を介して Slooce Tech API にテキスト メッセージを送信するアプリケーションを作成しています。アプリケーションは大量のテキスト メッセージを送信する必要があるため、速度を最適化しようとしています。

以下のコードの 2 番目の部分は、投稿を送信するために現在使用している方法です。私は最初のコードを書き、HTTPWebResponse高速化を図るために を省略しました。

問題は、新しいメソッドが実際には遅く、実行に 0.25 秒かかるのではなく、1 秒以上かかり、場合によってはスタックすることです。

なぜそれを行うのか、またはこのアプリケーションの速度を向上させるためのその他のヒントを知っている人はいますか? 追加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 個のタスクが生成されます。1 つの応答に時間がかかる場合、他の 9 つのスレッドは問題なく処理を続けます。

非同期リクエストと HTTPClient を組み込むことで、おそらくこれを改善できると思います。そのため、10 個のスレッドのそれぞれがブロックされることはありません。ただし、これを試したことがないため、例を挙げる資格はないと思います。

スレッドの数をとんでもない数まで増やしたくなるかもしれませんが、その誘惑は避けてください。スレッドの作成と管理のオーバーヘッドはすぐに追いつくでしょう。理想的な数はわかりませんが、ぜひ試してみてください。

于 2012-12-10T22:41:11.897 に答える