欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#使用HttpClient進(jìn)行Post請(qǐng)求出現(xiàn)超時(shí)問題的解決及優(yōu)化

 更新時(shí)間:2025年01月23日 10:27:48   作者:Thinbug  
最近我的控制臺(tái)程序發(fā)現(xiàn)有時(shí)候總是出現(xiàn)請(qǐng)求超時(shí)等問題,通常好幾分鐘最多只有3-4個(gè)請(qǐng)求,在使用apipost發(fā)現(xiàn)并發(fā)10個(gè)5分鐘也沒有問題,那么問題就出在我的請(qǐng)求端了,所以本文給大家介紹了C# 使用HttpClient進(jìn)行Post請(qǐng)求總是出現(xiàn)超時(shí)問題的優(yōu)化,需要的朋友可以參考下

優(yōu)化結(jié)論

我直接上優(yōu)化結(jié)論吧,就不放上老的代碼了。需要從以下幾個(gè)點(diǎn)來優(yōu)化。

單例HttpClient

問題:如果 HttpClient 實(shí)例頻繁創(chuàng)建和銷毀,可能導(dǎo)致連接池中的資源被占滿,新的請(qǐng)求需要等待釋放資源,從而造成長時(shí)間的延遲。

首先單例HttpClient,每次請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的 HttpClient 實(shí)例。HttpClient 的短生命周期會(huì)導(dǎo)致以下問題:

1,頻繁建立和銷毀連接,無法復(fù)用已有的連接池。

2,增加連接開銷,可能導(dǎo)致長時(shí)間等待(尤其在并發(fā)請(qǐng)求時(shí))。

所以我們直接

private static readonly HttpClient client = new HttpClient
{
    Timeout = TimeSpan.FromSeconds(15) // 設(shè)置超時(shí)時(shí)間
};

連接池耗盡和并發(fā)

合理設(shè)置 ServicePointManager.DefaultConnectionLimit,因?yàn)榫退闶菃卫腍ttpClient也會(huì)有連接數(shù)的限制。我們看看這個(gè)參數(shù)說明:

// 摘要:
//     Gets or sets the maximum number of concurrent connections allowed by a System.Net.ServicePoint
//     object.
//
// 返回結(jié)果:
//     The maximum number of concurrent connections allowed by a System.Net.ServicePoint
//     object. The default connection limit is 10 for ASP.NET hosted applications and
//     2 for all others. When an app is running as an ASP.NET host, it is not possible
//     to alter the value of this property through the config file if the autoConfig
//     property is set to true. However, you can change the value programmatically when
//     the autoConfig property is true. Set your preferred value once, when the AppDomain
//     loads.
//
// 異常:
//   T:System.ArgumentOutOfRangeException:
//     System.Net.ServicePointManager.DefaultConnectionLimit is less than or equal to
//     0.

有一句是重點(diǎn)
ASP的默認(rèn)連接限制是10。. NET托管應(yīng)用程序和其他的都是2。
我可能有時(shí)又3-4個(gè)并發(fā),可能問題在這里,那么我直接設(shè)置100個(gè)就足夠滿足我的程序了。

ServicePointManager.DefaultConnectionLimit = 100; // 調(diào)高默認(rèn)連接限制

并發(fā)異步

如果你的程序有很高的并發(fā),可能會(huì)耗盡你的CPU,那么需要使用異步。

HttpResponseMessage response = await client.PostAsync(url, content);

最終優(yōu)化后

我最終的代碼狀態(tài)如下:

public async Task<string> PostFormResult(string url, string parm)
{
    Log("PostFormResult 開始請(qǐng)求: " + url + ", parm: " + parm);
    try
    {
        byte[] buf = Encoding.UTF8.GetBytes(parm);
        using (HttpContent content = new ByteArrayContent(buf))
        {
        	//這里我是表單,可以換成json
            content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");
			//content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
			//添加Token	
		    //client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);

            HttpResponseMessage res = await client.PostAsync(url, content);

            if (res.IsSuccessStatusCode)
            {
                string json = await res.Content.ReadAsStringAsync();
                Log("PostFormResult請(qǐng)求成功: " + json);
                return json;
            }
            else
            {
                Warning("PostFormResult請(qǐng)求失敗: " + res.StatusCode);
            }
        }

    }
    catch (HttpRequestException ex)
	{
	    Warning("請(qǐng)求Post出現(xiàn)錯(cuò)誤: " + ex.Message);
	}
	catch (Exception ex)
	{
	    Warning($"請(qǐng)求Post出現(xiàn)錯(cuò)誤: {ex.Message}");
	}
    return string.Empty;
}

我的請(qǐng)求會(huì)同時(shí)出現(xiàn)了4個(gè)。所以超過了并發(fā)所以產(chǎn)生了問題,修改后就沒有問題了。

到此這篇關(guān)于C#使用HttpClient進(jìn)行Post請(qǐng)求總是出現(xiàn)超時(shí)問題的解決及優(yōu)化的文章就介紹到這了,更多相關(guān)C# HttpClient進(jìn)行Post請(qǐng)求出現(xiàn)超時(shí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談C#下winform和JS的互相調(diào)用和傳參(webbrowser)

    淺談C#下winform和JS的互相調(diào)用和傳參(webbrowser)

    下面小編就為大家?guī)硪黄獪\談C#下winform和JS的互相調(diào)用和傳參(webbrowser)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • C#獲取本機(jī)IP地址和Mac地址的方法

    C#獲取本機(jī)IP地址和Mac地址的方法

    這篇文章主要介紹了C#獲取本機(jī)IP地址和Mac地址的方法,實(shí)例分析了C#網(wǎng)絡(luò)功能的基本技巧,需要的朋友可以參考下
    2015-05-05
  • C# 使用 Castle 實(shí)現(xiàn) AOP及如何用 Autofac 集成 Castle

    C# 使用 Castle 實(shí)現(xiàn) AOP及如何用 Autofac 集成 Castle

    這篇文章主要介紹了C# 使用 Castle 實(shí)現(xiàn) AOP及如何用 Autofac 集成 Castle,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C#關(guān)于Func和Action委托的介紹詳解

    C#關(guān)于Func和Action委托的介紹詳解

    委托是存有對(duì)某個(gè)方法的引用的一種引用類型變量,本文主要介紹了C#關(guān)于Func和Action委托的介紹,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 淺析C#中的AsnycLocal與ThreadLocal

    淺析C#中的AsnycLocal與ThreadLocal

    這篇文章主要給大家介紹了關(guān)于C#中AsnycLocal與ThreadLocal的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C#使用MD5算法對(duì)密碼進(jìn)行加密的示例代碼

    C#使用MD5算法對(duì)密碼進(jìn)行加密的示例代碼

    MD5(Message Digest Algorithm 5)是一種被廣泛使用的“消息-摘要算法”,“消息-摘要算法”實(shí)際上就是一個(gè)單項(xiàng)散列函數(shù),數(shù)據(jù)塊經(jīng)過單向散列函數(shù)得到一個(gè)固定長度的散列值,本文給大家介紹了C#使用MD5算法對(duì)密碼進(jìn)行加密,需要的朋友可以參考下
    2024-03-03
  • 詳解C# 不能用于文件名的字符

    詳解C# 不能用于文件名的字符

    在 Windows 有一些字符是不能作為文件名,嘗試重命名一個(gè)文件,輸入/ 就可以看到windows 提示的不能作為文件名的字符,那么具體是包括哪些符號(hào)不能作為文件名呢?下面小編給大家介紹下
    2018-02-02
  • C#?wpf利用附加屬性實(shí)現(xiàn)界面上定義裝飾器

    C#?wpf利用附加屬性實(shí)現(xiàn)界面上定義裝飾器

    裝飾器是wpf中可以浮在控件上面的一種組件,我們通??梢杂脕韺?shí)現(xiàn)一些諸如控件拖動(dòng)點(diǎn)、提示框、自定義鼠標(biāo)等界面功能。本文主要是利用附加屬性實(shí)現(xiàn)界面上定義裝飾器,需要的可以參考下
    2022-12-12
  • C#面向?qū)ο笤O(shè)計(jì)原則之組合/聚合復(fù)用原則

    C#面向?qū)ο笤O(shè)計(jì)原則之組合/聚合復(fù)用原則

    這篇文章介紹了C#面向?qū)ο笤O(shè)計(jì)原則之組合/聚合復(fù)用原則,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C#實(shí)現(xiàn)系統(tǒng)信息監(jiān)控與獲取功能

    C#實(shí)現(xiàn)系統(tǒng)信息監(jiān)控與獲取功能

    在 C# 開發(fā)的眾多應(yīng)用場(chǎng)景中,獲取系統(tǒng)信息以及監(jiān)控用戶操作有著廣泛的用途,比如在系統(tǒng)性能優(yōu)化工具中,需要實(shí)時(shí)讀取 CPU、GPU 資源信息,本文將詳細(xì)介紹如何使用 C# 來實(shí)現(xiàn)這些功能,助力大家在開發(fā)中更好地與系統(tǒng)底層進(jìn)行交互,需要的朋友可以參考下
    2025-01-01

最新評(píng)論