亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Why is HttpContext.Current null after await?

2019-11-17 01:43:19
字體:
來源:轉載
供稿:網友

Why is HttpContext.Current null after await?

今天在對項目代碼進行異步化改進的時候,遇到一個奇怪的問題(莫笑,以前沒遇過),正如標題一樣,HttpContext.Current 在 await 異步執行之后,就會變為 null。

演示代碼:

       public async Task<IEnumerable<string>> Get()        {            await DoWaitAsync();            DoWork();            return  new string[] { "value1", "value2" };        }        PRivate Task DoWaitAsync()        {            return                Task.Factory.StartNew(                () =>                 {                    // null !!                    var httpCtx = System.Web.HttpContext.Current;                    Thread.Sleep(1000);                });        }        public void DoWork()        {            //Not null            var httpCtx = System.Web.HttpContext.Current;        }

HttpContext.Current 這個東西,我們并不陌生,在進行 asp.net 應用程序開發的時候,我們經常會用到,比如獲取當前請求的一些值,首先它是一個線程靜態屬性(thread-static variable),注意其中的關鍵字:當前請求和線程,也就是說它是和請求線程相關的,在 ASP.NET 應用程序中,一個請求線程會貫穿整個請求過程,所以我們可以在這個請求的任何地方,都可以訪問到 HttpContext.Current,這也就是它的“強大之處”,但是如果涉及到異步多線程呢?就不是這么回事了,因為 HttpContext.Current 依附的是當前請求的主線程,當我們使用 await 異步執行一些代碼的時候,再次執行下面的代碼,其實就不是當前請求線程了,所以我們再次訪問 HttpContext.Current 的時候,就變為 null 了,這個問題告誡我們,ASP.NET 應用程序中,如果進行異步化,使用 HttpContext.Current 一定要小心謹慎。

  • 需要注意的是:HttpContext.Current 在沒有進行 await 操作的時候,都是可以獲取到值的。

如果我們的 ASP.NET 應用程序進行了異步化,然后還必須用到 HttpContext.Current,那我們該怎么解決這個問題?

解決的方式有很多,如果應用程序很簡單,我們可以在 await 操作之前,先用變量存儲 HttpContext.Current,用到的地方直接用這個變量就行了,當然這不是一個“解決問題”的方法,還有一種是用 Cache,可以參考:system-web-httpcontext-current-nulls-itself-after-checking-for-a-cache,我覺得這種方式也是“瞎忽悠”,沒有從根本問題上進行解決。

其實想想問題的根源,就是如何在多個線程中共享一個 HttpContext.Current,這個在 MSDN 中表述為:共享/同步上下文(Synchronization Context)

You can use the TaskScheduler.FromCurrentSynchronizationContext method to specify that a task should be scheduled to run on a particular thread. This is useful in frameworks such as Windows Forms and Windows Presentation Foundation where access to user interface objects is often restricted to code that is running on the same thread on which the UI object was created. For more information, see How to: Schedule Work on a Specified Synchronization Context.

那我們如何在 ASP.NET 應用程序中,進行運用呢?答案很簡單,我們只需要在 web.config 中指定 targetFramework 版本為 4.5 即可:

<httpRuntime targetFramework="4.5" />

或者在 appSettings 中添加如下 key(測試可用):

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />

參考資料:

  • Why HttpContext.Current be null?
  • Why is HttpContext.Current null after await?
  • Why thread context does not flow to background thread in async/await?
  • HttpContext.Current并非無處不在

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩免费av片在线观看| 中文字幕日韩视频| 国产亚洲精品va在线观看| 97免费中文视频在线观看| 91久久在线视频| 最近2019年手机中文字幕| 亚洲最大中文字幕| 久久九九国产精品怡红院| 欧美日韩国产在线播放| 国产精品www色诱视频| 欧美日韩免费观看中文| 欧美日韩国产va另类| 中文字幕欧美专区| 亚州欧美日韩中文视频| 亚洲少妇中文在线| 国产精品偷伦一区二区| 国产成人亚洲精品| 亚洲国产精品美女| 精品视频一区在线视频| 国产香蕉一区二区三区在线视频| 国产一区二区三区久久精品| 亚洲国产精品高清久久久| 国产精品极品美女在线观看免费| 国产精品一区二区av影院萌芽| 欧美极品少妇xxxxⅹ喷水| 久久999免费视频| 92国产精品久久久久首页| 日本韩国欧美精品大片卡二| 在线观看精品自拍私拍| 久久久精品一区| 久久人人爽人人爽人人片av高清| 亚洲va欧美va国产综合久久| 欧美激情久久久久| 日韩欧美国产中文字幕| 国产欧美日韩高清| 中文字幕欧美亚洲| 久久久久久这里只有精品| 亚洲国产欧美久久| 日韩暖暖在线视频| 日日噜噜噜夜夜爽亚洲精品| 国产精品久久久久久久久久久久久久| 欧美黑人一区二区三区| 在线视频免费一区二区| 日韩国产在线播放| 亚洲欧美精品中文字幕在线| 美女性感视频久久久| 98精品国产自产在线观看| 国产成人精品在线视频| 成人国产精品免费视频| 久久久久久伊人| 欧美午夜女人视频在线| 福利二区91精品bt7086| 亚洲一区二区三区在线免费观看| 亚洲新声在线观看| 日韩激情视频在线播放| 欧美在线一区二区视频| 91久久久在线| 成人免费视频在线观看超级碰| 国产成人欧美在线观看| 高清欧美电影在线| 色香阁99久久精品久久久| 久久国产精品久久久久| 国产香蕉一区二区三区在线视频| 2019中文字幕在线免费观看| 久久成人一区二区| 精品人伦一区二区三区蜜桃网站| 国产成人综合一区二区三区| 国产精品久久网| 国产精品美女久久| 第一福利永久视频精品| 欧美人在线观看| 国产做受高潮69| 国产精品视频免费在线观看| 尤物九九久久国产精品的分类| 成人激情视频在线播放| 亚洲影视九九影院在线观看| 欧美精品免费看| 欧美电影在线观看完整版| 成人国产在线视频| 青青草99啪国产免费| 免费99精品国产自在在线| 日韩欧美国产骚| 日韩三级成人av网| 91久久国产精品91久久性色| 欧美午夜无遮挡| 在线视频欧美性高潮| 在线看福利67194| 正在播放亚洲1区| 国产精品视频区| 欧美电影在线观看完整版| 亚洲精品一区av在线播放| 国产综合色香蕉精品| 亚洲成人黄色网址| 久久天天躁狠狠躁夜夜躁2014| 国产丝袜一区二区三区免费视频| 国产精品中文字幕在线| 中文字幕亚洲欧美日韩在线不卡| 欧美激情精品久久久久久| 2020国产精品视频| 国产精品白丝av嫩草影院| 欧美黑人性视频| 黄色精品在线看| 欧美性色视频在线| 亚洲综合成人婷婷小说| 亚洲成av人影院在线观看| 亚洲a一级视频| 精品国产鲁一鲁一区二区张丽| 日韩高清免费观看| 97av在线视频| 亚洲aⅴ日韩av电影在线观看| 亚洲美女激情视频| 在线不卡国产精品| 国产精品自拍视频| 国产精品久久久久久久久免费看| 少妇精69xxtheporn| 欧美日韩裸体免费视频| 91香蕉嫩草神马影院在线观看| 亚洲精品白浆高清久久久久久| 国产精品av网站| 亚洲成av人影院在线观看| 久久精品国产精品亚洲| 国产99久久精品一区二区 夜夜躁日日躁| 欧美成人一区二区三区电影| 国产美女精品免费电影| 亚洲系列中文字幕| 亚洲国产成人精品久久| 国精产品一区一区三区有限在线| 欧美性猛交xxx| 日韩精品高清在线观看| 国语对白做受69| 91久久久久久久一区二区| 色综合亚洲精品激情狠狠| 亚洲精品免费一区二区三区| 日本91av在线播放| 68精品久久久久久欧美| 91在线免费视频| 一本色道久久综合狠狠躁篇的优点| 欧美大片在线免费观看| 91久久夜色精品国产网站| 清纯唯美日韩制服另类| 亚洲理论在线a中文字幕| 国内精品在线一区| 国产精品福利小视频| 亚州国产精品久久久| 亚洲国产精品va在线看黑人| 国产精品视频一区二区三区四| 精品亚洲国产成av人片传媒| 国产日产久久高清欧美一区| 欧美精品激情视频| 日韩经典中文字幕| 国产精品ⅴa在线观看h| 日韩欧美在线观看视频| 亚洲成人网在线| 欲色天天网综合久久| 日韩综合中文字幕| 欧美视频裸体精品| 亚洲自拍偷拍区| 亚洲欧美日韩精品久久亚洲区| 欧美在线一区二区三区四| 亚洲综合社区网| 欧美精品videossex88| 国产精品一久久香蕉国产线看观看| 久久久久女教师免费一区| 久久九九全国免费精品观看|