亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2019年04月11日 09:07:29   作者:Vam8023  
這篇文章主要給大家介紹了關于.net core并發(fā)下線程安全問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用.net core具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

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

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

.net core webapi項目,做了一個授權的filter(真正的生產(chǎn)項目的話,JWT很棒),單個接口測試沒有問題,當用前端在同一個頁面調(diào)用多個接口的時候,運行服務,打開頁面,然后……Exceptions……(真正的開發(fā)中大家應該也會遇到)

異常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:不允許啟動新事務,因為有其他線程正在該會話中運行。

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

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

一看很容易理解:在前一個操作完成之前,在此上下文中啟動第二個操作。任何實例成員都不能保證是線程安全的。就是說,我在用這個上下文的時候,你來搶個屁……

這個可能發(fā)生在并發(fā)的情況下,同時使用了同一個上下文……那么打開一個頁面,為什么會同時使用同一個上下文呢?好吧,在這里要負荊請罪了(可以說是自己的問題)

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

public class AuthFilterAttribute : ActionFilterAttribute
{

 public override void OnActionExecuting(ActionExecutingContext context)
 {

  base.OnActionExecuting(context);
    .....
  
  //判斷是否在黑名單內(nèi)
  var blackList = _app.GetBlackList();
  ......
 }}

這里為什么用 ActionFilterAttribute ?是因為測試的時候要監(jiān)測一下接口運行的整個過程,So……

然后還有一些錯是:對象引用未設置為對象的實例。這個錯誤太常見,不就是對象為Null了嗎?但是,未實例化對象在業(yè)務邏輯上的情況太多了。我的應該有:

1、沒有獲取到當前對象,這是.net core,不是.net,不是因為沒有new對象。是注入中沒有注入成功,獲取注入后,沒有獲取到。(但我本來運行的好好的,是因為一下是打開對接的頁面才發(fā)生的問題,可以排除了)

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

找啊找,其實方向有了,但是自己卻沒想起來……

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

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

(2)異常 2

 

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

1、是否應該使用 Scoped 和 Transient 的,你卻使用了 Singleton;

2、多線程中使用了 async 卻沒有配對的使用 await;

至少我找到的關鍵點是這兩個。

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

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

 

改為

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

看到一張圖?。。。ó斎荒阋部梢约毤氀凶x一下這個文檔)如下:

這還不明顯??。?!

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

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

我算是一個應用型的程序員,喜歡在應用中學習底層的東西。那么接下來當然就可以擴展 Singleton、Scoped 和 Transient 等知識了。

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • .NET 水晶報表使用代碼

    .NET 水晶報表使用代碼

    下面就是介紹在.net下,如何使用水晶報表的方法。
    2009-04-04
  • .net core使用redis基于StackExchange.Redis

    .net core使用redis基于StackExchange.Redis

    這篇文章主要為大家詳細介紹了.net core使用redis基于StackExchange.Redis的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • asp.net 購物車的實現(xiàn)淺析

    asp.net 購物車的實現(xiàn)淺析

    我從來沒有進行過正式的web開發(fā),但是我一直喜歡web,所以這篇文章也是我轉(zhuǎn)行web的一個開始吧?;蚨嗷蛏傥乙矃⒖剂藥讉€網(wǎng)站的實現(xiàn)(當然了,只是看看大概的功能而已),所以也請大家多多指教。
    2011-02-02
  • .Net使用SuperSocket框架實現(xiàn)WebSocket后端

    .Net使用SuperSocket框架實現(xiàn)WebSocket后端

    這篇文章介紹了.Net使用SuperSocket框架實現(xiàn)WebSocket后端,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-01-01
  • asp.net+ajax的Post請求實例

    asp.net+ajax的Post請求實例

    這篇文章主要介紹了asp.net+ajax的Post請求實現(xiàn)方法,實例分析了Ajax的發(fā)送post數(shù)據(jù)的原理與技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • Asp.net SignalR快速入門

    Asp.net SignalR快速入門

    這篇文章主要介紹了Asp.net SignalR快速入門,幫助大家可以快速的上手Asp.net SignalR,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 一個簡單的文件MD5碼自動計算比較器(附源碼)

    一個簡單的文件MD5碼自動計算比較器(附源碼)

    一直在玩 WOW ,發(fā)現(xiàn)網(wǎng)上的 MD5 計算工具都沒有自動比較功能,每次下載更新計算后,都要自己一個一個字母核對,比較麻煩。 最近開始學習 C# ,用 .NET ,做了一個簡單的文件MD5碼自動計算比較器。
    2013-02-02
  • Visual Studio 2015和 .NET Core安裝教程

    Visual Studio 2015和 .NET Core安裝教程

    這篇文章主要為大家詳細介紹了Visual Studio Community 2015和 .NET Core安裝圖文教程,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Log4net在.Net?Winform項目中的使用實例詳解

    Log4net在.Net?Winform項目中的使用實例詳解

    Log4net是一個流行的日志記錄工具,可以幫助開發(fā)人員在應用程序中實現(xiàn)高效的日志記錄,本文將提供一個詳細的分步驟示例,來幫助您在.Net Winform項目中使用Log4net,感興趣的朋友一起看看吧
    2023-08-08
  • MongoDB.Net工具庫MongoRepository使用方法詳解

    MongoDB.Net工具庫MongoRepository使用方法詳解

    這篇文章主要為大家詳細介紹了MongoDB.Net工具庫MongoRepository的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論