一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - ASP.NET教程 - .net core并發(fā)下線程安全問(wèn)題詳解

.net core并發(fā)下線程安全問(wèn)題詳解

2020-06-12 16:57Vam8023 ASP.NET教程

這篇文章主要給大家介紹了關(guān)于.net core并發(fā)下線程安全問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.net core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

抱歉,其實(shí)內(nèi)容并不如題!!!

背景(寫測(cè)試demo所出現(xiàn)的異常,供大家學(xué)習(xí)與拍磚):

.net core webapi項(xiàng)目,做了一個(gè)授權(quán)的filter(真正的生產(chǎn)項(xiàng)目的話,JWT很棒),單個(gè)接口測(cè)試沒(méi)有問(wèn)題,當(dāng)用前端在同一個(gè)頁(yè)面調(diào)用多個(gè)接口的時(shí)候,運(yùn)行服務(wù),打開頁(yè)面,然后……Exceptions……(真正的開發(fā)中大家應(yīng)該也會(huì)遇到)

異常1:An attempt was made to use the context while it is being configured. A DbContext instance cannot be used inside OnConfiguring since it is still being configured at this point. This can happen if a second operation is started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.

異常2:A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.

異常3:Invalid attempt to call Read when reader is closed.

異常4:Unable to cast object of type 'System.Data.ProviderBase.DbConnectionClosedConnecting' to type 'System.Data.SqlClient.SqlInternalConnectionTds'.

異常5:Object reference not set to an instance of an object.

異常6:不允許啟動(dòng)新事務(wù),因?yàn)橛衅渌€程正在該會(huì)話中運(yùn)行。

異常7:An error occurred while updating the entries. See the inner exception for details.

嘗試運(yùn)行了N多遍,嗯,挺不穩(wěn)定的(代碼垃圾!),那看看異常吧

一看很容易理解:在前一個(gè)操作完成之前,在此上下文中啟動(dòng)第二個(gè)操作。任何實(shí)例成員都不能保證是線程安全的。就是說(shuō),我在用這個(gè)上下文的時(shí)候,你來(lái)?yè)寕€(gè)屁……

這個(gè)可能發(fā)生在并發(fā)的情況下,同時(shí)使用了同一個(gè)上下文……那么打開一個(gè)頁(yè)面,為什么會(huì)同時(shí)使用同一個(gè)上下文呢?好吧,在這里要負(fù)荊請(qǐng)罪了(可以說(shuō)是自己的問(wèn)題)

我在Filter里面有查詢,用到數(shù)據(jù)庫(kù)上下文<DbContext> 。罪過(guò)咯,直接想在Filter里面過(guò)濾黑名單,所以查了數(shù)據(jù)庫(kù)(這個(gè)業(yè)務(wù)是不合理的,這是一個(gè)作死的行為,請(qǐng)謹(jǐn)慎看待,這里做學(xué)習(xí)討論之用)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class AuthFilterAttribute : ActionFilterAttribute
{
 
 public override void OnActionExecuting(ActionExecutingContext context)
 {
 
  base.OnActionExecuting(context);
    .....
  
  //判斷是否在黑名單內(nèi)
  var blackList = _app.GetBlackList();
  ......
 }}

這里為什么用 ActionFilterAttribute ?是因?yàn)闇y(cè)試的時(shí)候要監(jiān)測(cè)一下接口運(yùn)行的整個(gè)過(guò)程,So……

然后還有一些錯(cuò)是:對(duì)象引用未設(shè)置為對(duì)象的實(shí)例。這個(gè)錯(cuò)誤太常見(jiàn),不就是對(duì)象為Null了嗎?但是,未實(shí)例化對(duì)象在業(yè)務(wù)邏輯上的情況太多了。我的應(yīng)該有:

1、沒(méi)有獲取到當(dāng)前對(duì)象,這是.net core,不是.net,不是因?yàn)闆](méi)有new對(duì)象。是注入中沒(méi)有注入成功,獲取注入后,沒(méi)有獲取到。(但我本來(lái)運(yùn)行的好好的,是因?yàn)橐幌率谴蜷_對(duì)接的頁(yè)面才發(fā)生的問(wèn)題,可以排除了)

2、本來(lái)已經(jīng)實(shí)例的對(duì)象被回收了……(這可能性嘛……有一定的可能,但發(fā)生在哪呢?)

找啊找,其實(shí)方向有了,但是自己卻沒(méi)想起來(lái)……

其實(shí)如果不確定的話,倒是可以先找找別人是怎么說(shuō)的(不是為了裝X,找開發(fā)上的問(wèn)題我是推薦 github 和 stackoverflow 的,大部分的問(wèn)題都可以找到):

(1)異常 1 還有同樣 一條搜索結(jié)果

.net core并發(fā)下線程安全問(wèn)題詳解

.net core并發(fā)下線程安全問(wèn)題詳解

(2)異常 2

 .net core并發(fā)下線程安全問(wèn)題詳解

雖然以上找的不一定是真正的答案,至少提供了一個(gè)方向,并且你至少可以嘗試性地去解決一下。這里提供的方向其實(shí)很明確:

1、是否應(yīng)該使用 Scoped 和 Transient 的,你卻使用了 Singleton;

2、多線程中使用了 async 卻沒(méi)有配對(duì)的使用 await;

至少我找到的關(guān)鍵點(diǎn)是這兩個(gè)。

那怎么找到并解決這個(gè)問(wèn)題呢,.net core都是注入的,當(dāng)然 AuthFilterAttribute 也是注入的。跑到 Startup一看,很明顯,問(wèn)題出在哪里了 -- 單例!本應(yīng)該是Scoped模式的,卻用了單例。

那就將 AuthFilterAttribute 換一種注入模式就行啦。

.net core并發(fā)下線程安全問(wèn)題詳解

改為

.net core并發(fā)下線程安全問(wèn)題詳解

我使用的是Filter,F(xiàn)ilter有自己的生命周期,去確認(rèn)一下:Filter的官方文檔

看到一張圖!!!(當(dāng)然你也可以細(xì)細(xì)研讀一下這個(gè)文檔)如下:

.net core并發(fā)下線程安全問(wèn)題詳解

這還不明顯?!!!

Filter會(huì)被回收的!!!這同樣解釋了 異常3、4、5、6、7所發(fā)生的原因。

OK,問(wèn)題已經(jīng)解決了,這是在開發(fā)中遇到的問(wèn)題,可以說(shuō)是涉及到.net core 本身的運(yùn)行機(jī)制。

我算是一個(gè)應(yīng)用型的程序員,喜歡在應(yīng)用中學(xué)習(xí)底層的東西。那么接下來(lái)當(dāng)然就可以擴(kuò)展 Singleton、Scoped 和 Transient 等知識(shí)了。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)服務(wù)器之家的支持。

原文鏈接:https://www.cnblogs.com/Vam8023/p/10656777.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品日韩一区二区三区 | 丝袜足液精子免费视频 | 精品四虎国产在免费观看 | 国产精品天天影视久久综合网 | 日韩专区 | 波多野结衣之双方调教在线观看 | 日韩视频在线免费 | 亚洲精美视频 | 国产黄频在线观看 | 韩国美女豪爽一级毛片 | avtt手机版 | 免费在线视频一区 | 校草太大了h | 啪啪免费网址 | 亚洲精品国产AV成人毛片 | 日本sss在线高清观看 | 91理论片午午伦夜理片久久 | 日韩视频第二页 | 国产短视频精品一区二区三区 | 免费观看国产视频 | 美女福利视频一区二区 | 国产另类视频一区二区三区 | 久久se视频精品视频在线 | 男人肌肌捅女人 | 九九精品视频一区二区三区 | 18free性欧美另类hd | 色哟哟在线播放 | 视频在线观看一区二区 | 欧美综合精品一区二区三区 | 无人影院在线播放视频 | 精品一成人岛国片在线观看 | 精品视频二区 | 四缺一小说| jizz中国jizz老师水多 | 俄罗斯处女 | 99精品久久久久久 | 女教师巨大乳孔中文字幕免费 | 免费观看www视频 | 日本福利视频一区 | 天选之王漫画顾长歌免费阅读 | 欧美在线播放成人免费 |