通過 CancellationToken 提高 Web 性能

在 Web 開發中,經常會遇到這樣的場景:用戶發起一個請求,Web 服務器執行一些計算密集型的操作,等待結果返回給用戶。這種情況下,如果用戶在等待結果的過程中取消了請求,那么服務器端依然會繼續執行計算,這樣就會造成資源浪費。

為了解決這個問題,我們可以使用 CancellationToken 來提高 Web 性能。CancellationToken 是 .NET 中一個很重要的概念,它可以用于在代碼執行過程中取消操作。

下面,我們將通過一個示例來演示如何使用 CancellationToken 來提高 Web 性能。

代碼示例

下面是一段使用 CancellationToken 的代碼:

public?async?Task<int>?DoWorkAsync(CancellationToken?cancellationToken)
{var?result?=?0;for?(int?i?=?0;?i?<?10000;?i++){//?檢查是否已經取消操作cancellationToken.ThrowIfCancellationRequested();result?+=?i;}return?result;
}

上面的代碼定義了一個 DoWorkAsync 方法,該方法用于執行一個計算密集型的任務。在方法內部,我們使用了 CancellationToken 的 ThrowIfCancellationRequested 方法來檢查是否已經取消了操作。如果取消了操作,那么方法會拋出一個 OperationCanceledException 異常,并終止執行。

這樣,我們就可以在 Web 服務器端執行計算密集型的任務時,在用戶取消請求時及時停止執行,避免浪費資源。

使用建議

在實際開發中,我們可以將 CancellationToken 作為一個參數,傳遞給執行計算密集型任務的方法。例如,在 ASP.NET Core 中,我們可以在控制器的 Action 方法中加入一個 CancellationToken 參數,然后在執行計算任務時傳遞這個參數。

[HttpGet]
public?async?Task<IActionResult>?GetData(CancellationToken?cancellationToken)
{var?result?=?await?GetDataAsync(cancellationToken);return?Ok(result);
}

下面是一段演示了 cancellationToken 在 service 層和數據庫訪問層的使用方式的代碼:

//?service?層
public?async?Task<int>?GetDataAsync(CancellationToken?cancellationToken)
{//?執行計算密集型的任務var?result?=?await?DoWorkAsync(cancellationToken);//?訪問數據庫using?(var?dbContext?=?new?DbContext()){return?await?dbContext.SaveChangesAsync(cancellationToken);}
}

上面的代碼定義了一個 service 層的 GetDataAsync 方法,該方法用于從數據庫中獲取數據。在方法中,我們首先執行了一個計算密集型的任務,然后使用了 DbContext 的 CountAsync 方法來從數據庫中獲取數據。

在使用 cancellationToken 的過程中,我們首先在 GetDataAsync 方法的參數列表中加入了一個 CancellationToken 類型的參數。這樣,我們就可以在調用該方法時傳入一個 cancellationToken 參數,并在方法中使用它來檢查是否取消了操作。

在方法中,我們首先執行了一個計算密集型的任務,并將 cancellationToken 作為參數傳遞給了 DoWorkAsync 方法。如果在執行過程中用戶取消了操作,那么 DoWorkAsync 方法會拋出一個 OperationCanceledException 異常,并終止執行。

然后,我們使用 DbContext 的 SaveChangesAsync 方法來從數據庫中獲取數據。在調用 SaveChangesAsync 方法時,我們也將 cancellationToken 作為參數傳遞進去。如果用戶取消了操作,那么 SaveChangesAsync 方法也會拋出一個 OperationCanceledException 異常,并停止執行。

總結

通過使用 CancellationToken,我們可以在用戶取消請求時,及時停止執行的任務,避免浪費資源。

參考資料

  • CancellationToken

  • DbContext.SaveChangesAsync

本文采用 Chat OpenAI 輔助注水澆筑而成,如有雷同,完全有可能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280271.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

libreoffice_如何更改您在LibreOffice中可以撤消的操作數

libreofficeIn LibreOffice programs, you can undo one action after another…to a point. The default number of actions you can undo is 100, but that number is easy to change. 在LibreOffice程序中&#xff0c;您可以撤消一個動作&#xff0c;直到某個點。 您可以撤消…

遠程連接服務器出現身份驗證錯誤 要求的函數不受支持

來源&#xff1a;https://www.cnblogs.com/lindajia/p/9021082.html 以往發布程序到服務器都沒問題。今天遠程桌面連接到服務器&#xff0c;突然出現了異常&#xff01;異常信息為&#xff1a; 在網上看到有多種解決方案&#xff1a;發現有種修改注冊表的方式很簡單。 詳細步驟…

截取圖片生成頭像插件

上傳頭像插件 目的&#xff1a; 幫助開發者快速開發上傳頭像功能點 背景&#xff1a; 現在b&#xff0c;g能搜到的頭像上傳插件并不太好用&#xff0c;所以想提供一個比較自由度的上傳并且可以剪切的插件。 資源&#xff1a; 具體資源請查看這里 實現大致思路如下&#xff1a; …

CDH集群安裝配置(五)- Cloudera Manager Server

在線安裝 sudo yum install cloudera-manager-daemons cloudera-manager-server 離線安裝 資源下載地址 https://archive.cloudera.com/cm6/6.1.0/redhat7/yum/RPMS/x86_64/ 上次下面資源包到cdh1節點 cloudera-manager-server-6.1.0-769885.el7.x86_64.rpm cloudera-manager-s…

c++簡單程序設計-5

編程實驗部分1.vector3.cpp #include <iostream> #include <vector> #include <string> using namespace std;// 函數聲明 void output1(vector<string> &); void output2(vector<string> &); int main() {vector<string>like…

關于JavaScript的編譯原理

引擎&#xff1a;負責整個js程序的編譯和執行過程編譯器&#xff1a;負責語法分析和代碼生成作用域&#xff1a;收集和維護一系列查詢&#xff08;由所有聲明的標識符組成&#xff09; 【例子&#xff1a;聲明一個變量并賦值 var a value&#xff1b;】 Step1.編譯器對該程序段…

safari檢查元素_如何防止Safari檢查是否使用Apple Pay

safari檢查元素Apple Pay’s incorporation into macOS Sierra makes it really easy to pay using the service on your Mac with your iPhone or iPad. But that doesn’t mean just because you can, you will, or will want to use Apple Pay in the future. 通過將Apple P…

spring boot中servlet啟動原理

啟動過程及原理 1 spring boot 應用啟動運行run方法 StopWatch stopWatch new StopWatch();stopWatch.start();ConfigurableApplicationContext context null;FailureAnalyzers analyzers null;configureHeadlessProperty();SpringApplicationRunListeners listeners getRu…

某乎有人問--微軟會拋棄C#嗎,有點擔心?

在某乎有人問&#xff1a;微軟會拋棄C#嗎&#xff0c;有點擔心&#xff1f;&#xff0c;類似這樣的問題&#xff0c;一直都有很多人在問&#xff0c;今天我們就來聊聊這個問題。沒必要擔心微軟倒閉了&#xff0c;C#都不會消失&#xff0c;其實.Net已經不屬于微軟的了。C#是屬于…

mailing list的原理

1 發往mailing list郵箱的郵件會被所有訂閱了該郵箱的人收到 說白了&#xff0c;就是一種郵件群發機制&#xff0c;為了簡化群發&#xff0c;不是將所有的收件人放到收件人列表中&#xff0c;而是發往總的郵箱即可。 2 要向該mailing list郵箱中發送郵件需要先要訂閱 但是&…

icloud上傳錯誤_如何修復HomeKit“地址未注冊到iCloud”錯誤

icloud上傳錯誤While Apple has made serious improvements to the HomeKit smarthome framework, there are still more than a few ghosts in the machine. Let’s look at how to banish the extremely frustrating “Address is not registered with iCloud” error to get…

Jenkins安裝部署

Jenkins安裝部署 Jenkins簡介 Jenkins是一個開源軟件項目&#xff0c;是基于Java開發的一種持續集成工具&#xff0c;用于監控持續重復的工作&#xff0c;旨在提供一個開放易用的軟件平臺&#xff0c;使軟件的持續集成變成可能。 安裝步驟 本文以CentOS7為環境&#xff0c;安裝…

Angular2中的路由(簡單總結)

Angular2中建立路由的4個步驟&#xff1a; 1、路由配置&#xff1a;最好新建一個app.toutes.ts文件&#xff08;能不能用ng命令新建有待調查&#xff09; Angular2中路由要解決的是URL與頁面的對應關系&#xff08;比如URL是http://localhost:4200/all-people&#xff0c;那么頁…

受 SQLite 多年青睞,C 語言到底好在哪兒?

SQLite 近日發表了一篇博文&#xff0c;解釋了為什么多年來 SQLite 一直堅持用 C 語言來實現&#xff0c;以下是正文內容&#xff1a; C 語言是最佳選擇 從2000年5月29日發布至今&#xff0c;SQLite 一直都是用 C 語言實現。C 一直是實現像 SQLite 這類軟件庫的最佳語言。目前&…

為什么 Random.Shared 是線程安全的

在多線程環境中使用 Random 類來生成偽隨機數時&#xff0c;很容易出現線程安全問題。例如&#xff0c;當多個線程同時調用 Next 方法時&#xff0c;可能會出現種子被意外修改的情況&#xff0c;導致生成的偽隨機數不符合預期。為了避免這種情況&#xff0c;.NET 框架引入了 Ra…

(3)Python3筆記之變量與運算符

一、變量 1&#xff09;. 命名規則&#xff1a; 1. 變量名不能使用系統關鍵字或保留關鍵字 2. 變量區分大小寫 3. 變量命名由字母&#xff0c;數字&#xff0c;下劃線組成但不能以數字開頭 4. 不需要聲明變量類型 是 a 1 非 int a 1 5. 查看變量內存地址 id(a), id(b) 6…

some demos

import ../css/detail.css;// 找到字符串中重復次數最多的字符 function findMax(str) {let maxChar ;let maxValue 1;if (!str.length) return;let arr str.replace(/\s/g, ).split();let obj {};for (let i 0; i < arr.length; i) {if (!obj[arr[i]]) {obj[arr[i]] …

WPF 實現視頻會議與會人員動態布局

WPF 實現視頻會議與會人員動態布局控件名&#xff1a;SixGridView作 者&#xff1a;WPFDevelopersOrg - 驚鏵原文鏈接[1]&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40&#xff1b;Visual Studio 2019;接著上一篇是基于Grid實現的視頻查看感…

漢三水屬國(北地屬國、安定屬國)

漢三水屬國&#xff08;北地屬國、安定屬國&#xff09; 兩漢&#xff08;西漢、東漢&#xff09;400年中&#xff0c;由于各種原因&#xff0c;經常有成批的匈奴歸附漢朝&#xff0c;兩漢政府對他們采取了較為妥善的安置政策&#xff0c;其中最主要的措施是為他們設立專門的居…