簡體   English   中英

3個請求后.NET HttpClient.PostAsync()變慢

[英].NET HttpClient.PostAsync() slow after 3 requests

我正在使用.NET 4.5 HttpClient類向服務器多次發出POST請求。 前三個調用運行很快,但是第四次調用await client.PostAsync(...) ,它掛起了幾秒鍾,然后返回了預期的響應。

using (HttpClient client = new HttpClient())
{
    // Prepare query
    StringBuilder queryBuilder = new StringBuilder();
    queryBuilder.Append("?arg=value");

    // Send query
    using (var result = await client.PostAsync(BaseUrl + queryBuilder.ToString(),
        new StreamContent(streamData)))
    {
        Stream stream = await result.Content.ReadAsStreamAsync();
        return new MyResult(stream);
    }
}

服務器代碼如下所示:

HttpListener listener;

void Run()
{
    listener.Start();

    ThreadPool.QueueUserWorkItem((o) =>
     {
        while (listener.IsListening)
        {
            ThreadPool.QueueUserWorkItem((c) =>
            {
                var context = c as HttpListenerContext;
                try
                {
                    // Handle request
                }
                finally
                {
                    // Always close the stream
                    context.Response.OutputStream.Close();
                }
            }, listener.GetContext());
        }
    });
}

// Handle request中插入調試語句表明,服務器代碼似乎在發送請求后並未立即接收到。

我已經研究了客戶端不關閉響應是否有問題,這意味着可以達到ServicePoint提供程序允許的連接數。 但是,我嘗試增加ServicePointManager.MaxServicePoints但這根本沒有效果。

我也發現了類似的問題:

.NET HttpClient在多個請求后掛起(除非Fiddler處於活動狀態)

我不認為這是我的代碼存在的問題-甚至將代碼更改為此處給出的代碼也無法解決問題。

問題是計划運行的Task實例太多。

更改程序中的某些Task.Factory.StartNew調用以使用TaskCreationOptions.LongRunning選項運行很長時間的TaskCreationOptions.LongRunning可以解決此問題。 看來任務調度程序在將請求調度到服務器之前正在等待其他任務完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM