日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Why is HttpContext.Current null after await?

發布時間:2025/3/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(){returnTask.Factory.StartNew(() => {// null !!var httpCtx = System.Web.HttpContext.Current;Thread.Sleep(1000);});}public void DoWork(){//Not nullvar 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并非無處不在

總結

以上是生活随笔為你收集整理的Why is HttpContext.Current null after await?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。