国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Winform中使用HttpClient(設(shè)置最大超時(shí)響應(yīng)時(shí)間)調(diào)用接口并做業(yè)務(wù)處理時(shí)界面卡住,使用async Task await異步任務(wù)編程優(yōu)化

這篇具有很好參考價(jià)值的文章主要介紹了Winform中使用HttpClient(設(shè)置最大超時(shí)響應(yīng)時(shí)間)調(diào)用接口并做業(yè)務(wù)處理時(shí)界面卡住,使用async Task await異步任務(wù)編程優(yōu)化。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

場(chǎng)景

Winform中怎樣使用HttpClient調(diào)用http的get和post接口并將接口返回json數(shù)據(jù)解析為實(shí)體類:

Winform中怎樣使用HttpClient調(diào)用http的get和post接口并將接口返回json數(shù)據(jù)解析為實(shí)體類_winform請(qǐng)求http接口_霸道流氓氣質(zhì)的博客-CSDN博客

參考前面使用HttpClient調(diào)用http的get和post接口的小示例,

需要定位調(diào)用http的get接口并對(duì)接口返回?cái)?shù)據(jù)進(jìn)行后續(xù)處理。

關(guān)于定時(shí)器的使用在下面文章中有涉及到

Winform中使用mysqldump實(shí)現(xiàn)選擇部分表定期備份mysql數(shù)據(jù)庫(kù):

Winform中使用mysqldump實(shí)現(xiàn)選擇部分表定期備份mysql數(shù)據(jù)庫(kù)_mysqldump 部分表_霸道流氓氣質(zhì)的博客-CSDN博客

注:

博客:
霸道流氓氣質(zhì)的博客_CSDN博客-C#,架構(gòu)之路,SpringBoot領(lǐng)域博主

實(shí)現(xiàn)

1、初次業(yè)務(wù)實(shí)現(xiàn)邏輯比較簡(jiǎn)單,未考慮任務(wù)同步執(zhí)行堵塞UI線程的情況。

在測(cè)試時(shí)發(fā)現(xiàn),當(dāng)http接口不通時(shí),而又未設(shè)置httpClient的最大超時(shí)響應(yīng)時(shí)間,

會(huì)導(dǎo)致頁(yè)面卡死無(wú)響應(yīng)。

優(yōu)化前的代碼:

??????? private void convertPositionControl() {
??????????? try
??????????? {
??????????????? //獲取接口數(shù)據(jù)
??????????????? var positionData = requestGetHttpData(positionCalculateUrl);
??????????????? //http請(qǐng)求不到數(shù)據(jù),啥也不干
??????????????? if (null == positionData)
??????????????? {
??????????????????? return;
??????????????? }//請(qǐng)求到數(shù)據(jù),則進(jìn)行數(shù)據(jù)處理
??????????????? else
??????????????? {
?
??????????????? }
??????????? }
??????????? catch (Exception exception)
??????????? {
??????????????? textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":獲取接口出錯(cuò):");
??????????????? textBox_log.AppendText("\r\n");
??????????????? textBox_log.AppendText(exception.Message);
??????????? }
??????? }

上面是在定時(shí)器中具體執(zhí)行的代碼,省略部分邏輯,其中請(qǐng)求http接口的方法是

requestGetHttpData,參數(shù)getAllBaseStationInfoUrl是接口url。

然后請(qǐng)求接口的方法具體實(shí)現(xiàn)是

??????? private string requestGetHttpData(string apiUrl)
??????? {
??????????? try {
??????????????? //調(diào)用接口請(qǐng)求數(shù)據(jù)
??????????????? var originAddressUrl = apiUrl;
??????????????? //請(qǐng)求接口數(shù)據(jù)
??????????????? if (null == httpClient) {
??????????????????? httpClient = new HttpClient();
??????????????? }
??????????????? var url = new Uri(originAddressUrl);
??????????????? var response = httpClient.GetAsync(url).Result;
??????????????? var data = response.Content.ReadAsStringAsync().Result;
??????????????? return data;
??????????? }
??????????? catch (Exception exception) {???
??????????????? textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":調(diào)用接口" + apiUrl + "異常:" + exception.Message);
??????????????? textBox_log.AppendText("\r\n");
??????????????? return null;
??????????? }
??????? }

這里直接未作任何考慮,只是考慮接口正常的情況。

但是當(dāng)接口不存在或者報(bào)錯(cuò)時(shí)就會(huì)導(dǎo)致頁(yè)面卡死。

注意:

HttpClient的預(yù)熱機(jī)制,不要在每次請(qǐng)求接口時(shí)都要初始化

httpClient = new HttpClient();

這里放在頁(yè)面加載完成之后進(jìn)行初始化一次

??????? private void Form1_Load(object sender, EventArgs e)
??????? {
??????????? httpClient = new HttpClient();
??????????? httpClient.Timeout = TimeSpan.FromSeconds(httpClientMaxResponseSeconds);
??????? }

另外需要給httpClient設(shè)置最大響應(yīng)超時(shí)時(shí)長(zhǎng)

2、C# 中 HttpClient設(shè)置最大響應(yīng)超時(shí)時(shí)長(zhǎng)

?httpClient.Timeout = TimeSpan.FromSeconds(httpClientMaxResponseSeconds);

這里httpClientMaxResponseSeconds是

private double httpClientMaxResponseSeconds = 2;

這里設(shè)置為2秒。

后續(xù)建議將其優(yōu)化為單例模式或其他更好的模式。

3、上面卡住問題是因?yàn)樵谕綀?zhí)行的方法中,請(qǐng)求接口的方法會(huì)堵塞UI線程/主線程。

需要將上面請(qǐng)求接口的方法修改成異步任務(wù)執(zhí)行的機(jī)制,避免影響UI線程。

這塊在之前寫mqtt連接時(shí)用到到,但是當(dāng)時(shí)不知其所以然。

c# httpclient 超時(shí),C#,ui,json,java?

Winform中使用MQTTnet實(shí)現(xiàn)MQTT的服務(wù)端和客戶端之間的通信以及將訂閱的消息保存到文件:

Winform中使用MQTTnet實(shí)現(xiàn)MQTT的服務(wù)端和客戶端之間的通信以及將訂閱的消息保存到文件_mqtt winform_霸道流氓氣質(zhì)的博客-CSDN博客

4、異步

同步和異步主要用于修飾方法。當(dāng)一個(gè)方法被調(diào)用時(shí),調(diào)用者需要等待該方法執(zhí)行完畢并返回才能繼續(xù)執(zhí)行,

我們稱這個(gè)方法是同步方法;當(dāng)一個(gè)方法被調(diào)用時(shí)立即返回,并獲取一個(gè)線程執(zhí)行該方法內(nèi)部的業(yè)務(wù),

調(diào)用者不用等待該方法執(zhí)行完畢,我們稱這個(gè)方法為異步方法。

異步的好處在于非阻塞(調(diào)用線程不會(huì)暫停執(zhí)行去等待子線程完成),因此我們把一些不需要立即使用結(jié)果、

較耗時(shí)的任務(wù)設(shè)為異步執(zhí)行,可以提高程序的運(yùn)行效率。net4.0在ThreadPool的基礎(chǔ)上推出了Task類,

微軟極力推薦使用Task來執(zhí)行異步任務(wù),現(xiàn)在C#類庫(kù)中的異步方法基本都用到了Task;net5.0推出了async/await,

讓異步編程更為方便。

在C#5.0中出現(xiàn)的 async和await ,讓異步編程變得更簡(jiǎn)單。

關(guān)于async Task 和await的使用不再詳述,具體可自行學(xué)習(xí)。

下面參考一個(gè)網(wǎng)絡(luò)上的示例

class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? string content = GetContentAsync(Environment.CurrentDirectory + @"/test.txt").Result;
??????????? //調(diào)用同步方法
??????????? //string content = GetContent(Environment.CurrentDirectory + @"/test.txt");
??????????? Console.WriteLine(content);
??????????? Console.ReadKey();
??????? }
??????? //異步讀取文件內(nèi)容
??????? async static Task<string> GetContentAsync(string filename)
??????? {
???????????
??????????? FileStream fs = new FileStream(filename, FileMode.Open);
??????????? var bytes = new byte[fs.Length];
??????????? //ReadAync方法異步讀取內(nèi)容,不阻塞線程
??????????? Console.WriteLine("開始讀取文件");
??????????? int len = await fs.ReadAsync(bytes, 0, bytes.Length);
??????????? string result = Encoding.UTF8.GetString(bytes);
??????????? return result;
??????? }
??????? //同步讀取文件內(nèi)容
??????? static string GetContent(string filename)
??????? {
??????????? FileStream fs = new FileStream(filename, FileMode.Open);
??????????? var bytes = new byte[fs.Length];
??????????? //Read方法同步讀取內(nèi)容,阻塞線程
??????????? int len =? fs.Read(bytes, 0, bytes.Length);
??????????? string result = Encoding.UTF8.GetString(bytes);
??????????? return result;
??????? }
??? }

優(yōu)化代碼

首先將HttpClient修改為單例模式,避免每次請(qǐng)求接口都去new

新建類

{

??? class Global
??? {

??????? private static string _lockFlag = "GlobalLock";

??????? private static Global _instance;


??????? //http請(qǐng)求客戶端
??????? public HttpClient httpClient = new HttpClient();

??????? private Global()
??????? {

??????? }

??????? public static Global Instance
??????? {
??????????? get
??????????? {
??????????????? lock (_lockFlag)
??????????????? {
??????????????????? if (_instance == null)
??????????????????? {
??????????????????????? _instance = new Global();
??????????????????? }
??????????????????? return _instance;
??????????????? }
??????????? }
??????? }

??? }
}

關(guān)于全局/單例的實(shí)現(xiàn)可以參考如下:

C#中全局作用域的常量、字段、屬性、方法的定義與使用:

C#中全局作用域的常量、字段、屬性、方法的定義與使用_霸道流氓氣質(zhì)的博客-CSDN博客

這里就一個(gè)窗體,所以在窗體初始化后設(shè)置其響應(yīng)時(shí)長(zhǎng),也可放在全局工具類的get方法中

??????? private void Form1_Load(object sender, EventArgs e)
??????? {
??????????? //設(shè)置http連接超時(shí)時(shí)間
??????????? Global.Instance.httpClient.Timeout = TimeSpan.FromSeconds(httpClientMaxResponseSeconds);
??????? }

然后改造請(qǐng)求Http接口的方法

??????? private async Task<string> requestGetHttpData(string apiUrl)
??????? {
??????????? try {
??????????????? var originAddressUrl = apiUrl;
??????????????? //請(qǐng)求接口數(shù)據(jù)????????
??????????????? var url = new Uri(originAddressUrl);
??????????????? string jsonResponse = await Global.Instance.httpClient.GetStringAsync(url);
??????????????? return jsonResponse;
??????????? }
??????????? catch (Exception exception) {

??????????????? textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":調(diào)用接口" + apiUrl + "異常:" + exception.Message);
??????????????? textBox_log.AppendText("\r\n");
????????????????
??????????????? return null;
??????????? }
??????? }

將方法添加async Task<string>,注意這里httpClient調(diào)用GetStringAsync方法前面加了await

然后定時(shí)器執(zhí)行中的方法調(diào)用修改為

??????? private async Task convertPositionControl() {
??????????? try
??????????? {
??????????????? //獲取接口數(shù)據(jù)
??????????????? var positionData = await requestGetHttpData(positionCalculateUrl);
??????????????? //http請(qǐng)求不到數(shù)據(jù),啥也不干
??????????????? if (null == positionData)
??????????????? {
??????????????????? return;
??????????????? }//請(qǐng)求到數(shù)據(jù),則進(jìn)行數(shù)據(jù)處理
??????????????? else
??????????????? {
???????????????????
??????????????? }
??????????? }
??????????? catch (Exception exception)
??????????? {
??????????????? textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":獲取接口出錯(cuò):");
??????????????? textBox_log.AppendText("\r\n");
??????????????? textBox_log.AppendText(exception.Message);
??????????? }
??????? }

至此,不會(huì)導(dǎo)致界面卡住的現(xiàn)象。文章來源地址http://www.zghlxwxcb.cn/news/detail-788492.html

到了這里,關(guān)于Winform中使用HttpClient(設(shè)置最大超時(shí)響應(yīng)時(shí)間)調(diào)用接口并做業(yè)務(wù)處理時(shí)界面卡住,使用async Task await異步任務(wù)編程優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue請(qǐng)求時(shí)間太長(zhǎng)_接口處理請(qǐng)求時(shí)間過長(zhǎng),前臺(tái)響應(yīng)“服務(wù)器超時(shí)”的解決辦法

    這些方法可以根據(jù)具體需求和情況進(jìn)行選擇和組合使用,以提高前端的用戶體驗(yàn)和接口的性能。同時(shí),還需要考慮服務(wù)器端的性能和網(wǎng)絡(luò)環(huán)境,以及前后端的協(xié)作來實(shí)現(xiàn)最佳的用戶體驗(yàn)。

    2024年02月09日
    瀏覽(95)
  • 前端頁(yè)面超時(shí)時(shí)間設(shè)置

    前端頁(yè)面超時(shí)時(shí)間設(shè)置

    有志者,事竟成 文章持續(xù)更新,可以關(guān)注【小奇JAVA面試】第一時(shí)間閱讀,回復(fù)【資料】獲取福利,回復(fù)【項(xiàng)目】獲取項(xiàng)目源碼,回復(fù)【簡(jiǎn)歷模板】獲取簡(jiǎn)歷模板,回復(fù)【學(xué)習(xí)路線圖】獲取學(xué)習(xí)路線圖。 在項(xiàng)目中我們經(jīng)常會(huì)有超時(shí)的情況發(fā)生,例如點(diǎn)擊某一個(gè)查詢按鈕,然后

    2024年02月11日
    瀏覽(31)
  • 設(shè)置RabbitMQ超時(shí)時(shí)間

    RabbitMQ默認(rèn)的超時(shí)時(shí)間是30分鐘,在消息消費(fèi)超過30分鐘后,rabbitMQ會(huì)發(fā)生錯(cuò)誤,導(dǎo)致整個(gè)channel被銷毀,無(wú)法繼續(xù)消費(fèi) 在RabbitMQ安裝的終端執(zhí)行 命令,將超時(shí)時(shí)間延長(zhǎng)。 使用 可以查看設(shè)置的超時(shí)值。 值得注意的是,這個(gè)事臨時(shí)更改,永久更改需要進(jìn)入 rabbitmq.con f 文件里修改

    2024年02月04日
    瀏覽(36)
  • axios設(shè)置超時(shí)時(shí)間

    方式一: 方式二: 3.創(chuàng)建實(shí)例 可以使用自定義配置新建一個(gè) axios 實(shí)例?: axios.create([config]) 4.判斷超時(shí)

    2024年02月12日
    瀏覽(23)
  • 【JAVA】設(shè)置http超時(shí)時(shí)間

    setConnectTimeout:設(shè)置連接超時(shí)時(shí)間,單位毫秒。 setConnectionRequestTimeout:設(shè)置從connect Manager獲取Connection 超時(shí)時(shí)間,單位毫秒。這個(gè)屬性是新加的屬性,因?yàn)槟壳鞍姹臼强梢怨蚕磉B接池的。 setSocketTimeout:請(qǐng)求獲取數(shù)據(jù)的超時(shí)時(shí)間,單位毫秒。 如果訪問一個(gè)接口,多少時(shí)間內(nèi)無(wú)

    2024年02月11日
    瀏覽(27)
  • axios 設(shè)置超時(shí)時(shí)間 timeout

    在項(xiàng)目中,所有請(qǐng)求都是走統(tǒng)一封裝過的axios,統(tǒng)一設(shè)置了超時(shí)時(shí)間: 但是有一個(gè)接口耗費(fèi)時(shí)間巨長(zhǎng),網(wǎng)絡(luò)不好時(shí)經(jīng)常會(huì)超時(shí),改統(tǒng)一設(shè)置的超時(shí)時(shí)間感覺不太好,所以想針對(duì)這個(gè)請(qǐng)求單獨(dú)設(shè)置超時(shí)時(shí)間。 以下是普通請(qǐng)求: 單獨(dú)設(shè)置請(qǐng)求超時(shí)時(shí)間:

    2024年02月16日
    瀏覽(23)
  • 【Jenkins】Pipeline - 設(shè)置超時(shí)時(shí)間

    默認(rèn)時(shí)間單位為 MINUTES ,如果其他時(shí)間單位,則使用 unit 參數(shù):SECONDS、MINUTES和HOURS 可以在不同級(jí)別(每個(gè)整體管道或每個(gè)階段)使用options指定超時(shí) 在上面的示例中,在階段超時(shí)之后,流水線中止,并顯示以下消息: Sending interrupt signal to process Cancelling nested steps due to timeout 如果

    2024年02月17日
    瀏覽(24)
  • CSDN博客批量查詢質(zhì)量分https://yma16.inscode.cc/請(qǐng)求超時(shí)問題(設(shè)置postman超時(shí)時(shí)間)(接口提供者設(shè)置了nginx超時(shí)時(shí)間)

    CSDN博客批量查詢質(zhì)量分https://yma16.inscode.cc/請(qǐng)求超時(shí)問題(設(shè)置postman超時(shí)時(shí)間)(接口提供者設(shè)置了nginx超時(shí)時(shí)間)

    https://yma16.inscode.cc/ 查詢別人的一下子就返回了,查詢我自己的,1分鐘還不返回,然后就顯示超時(shí)了。。 一開始我還以為是這個(gè)開源項(xiàng)目本身的問題,設(shè)置了請(qǐng)求超時(shí)時(shí)間,我還給它改了超時(shí)時(shí)間,后來發(fā)現(xiàn)不是的。。。 本來是100000的,我給改成1000000了,我對(duì)js代碼不熟,

    2024年02月12日
    瀏覽(93)
  • Linux設(shè)置登錄自動(dòng)退出超時(shí)時(shí)間

    Linux設(shè)置登錄自動(dòng)退出超時(shí)時(shí)間

    一、背景 最近登錄一臺(tái)服務(wù)器后,過一會(huì)沒有操作就會(huì)被強(qiáng)制登出,并提示 對(duì)于使用了sudo的時(shí)候來說,真的好麻煩,重新連上還得重新sudo 怎么延長(zhǎng)這個(gè)時(shí)間呢,來朋友們跟著往下看。 二、設(shè)置辦法 用如下命令設(shè)置 查看文件最后,如果設(shè)置了 TMOUT 變量,則根據(jù)需要修改

    2024年02月17日
    瀏覽(22)
  • python requests設(shè)置連接超時(shí)時(shí)間

    這段代碼的主要作用是使用requests庫(kù)發(fā)出一個(gè)GET請(qǐng)求,并設(shè)置連接超時(shí)時(shí)間為5秒鐘,讀取超時(shí)時(shí)間為10秒鐘。 如果請(qǐng)求超時(shí),就會(huì)拋出requests.exceptions.Timeout異常,并在\\\"except\\\"語(yǔ)句塊中進(jìn)行處理。如果發(fā)生其他類型的錯(cuò)誤,如連接錯(cuò)誤,就會(huì)拋出requests.exceptions.ConnectionError異常,

    2024年02月13日
    瀏覽(47)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包