亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

線程上下文切換 多線程下的調(diào)用上下文 : CallContext( 三 )


4、子線程中使用LogicalSetData改變數(shù)據(jù)槽的值,不會(huì)影響父線程的數(shù)據(jù)槽,即使他們的key是同一個(gè);
3 .NET Core下沒(méi)有CallContext
在.NET Core下沒(méi)有CallContext類(lèi),取而代之的是使用AsyncLocal代替,實(shí)現(xiàn)的是CallContext.LogicalGetData 和 CallContext.SetLogicalCallContext 。
例如,下面是一個(gè)示例代碼,我們可以借助AsyncLocal來(lái)自己實(shí)現(xiàn)一個(gè)CallContext類(lèi) 。如果你是將.NET Framework升級(jí)為.NET Core,那么你可能需要自己實(shí)現(xiàn)一個(gè)CallContext類(lèi)來(lái)代替之前的CallContext:
public static class CallContext{static ConcurrentDictionary<string, AsyncLocal<object>> state = new ConcurrentDictionary<string, AsyncLocal<object>>();public static void SetData(string name, object data) =>state.GetOrAdd(name, _ => new AsyncLocal<object>()).Value = http://hnpxn.com/IT/data;public static object GetData(string name) =>state.TryGetValue(name, out AsyncLocal data) ? data.Value : null;}4EF DbContext場(chǎng)景
對(duì)于像UnitOfWork這種操作模式,是比較適合于CallContext發(fā)揮的地方,讓EF DbContext在線程上下文內(nèi)保持唯一 。
注意:這里提到的EF均指EF 而非 EF Core 。
因此,我們經(jīng)??梢钥吹饺缦滤镜氖纠a:
public class DbContextFactory{public static DbContext CreateDbContext(){DbContext dbContext = (DbContext)CallContext.GetData("dbContext");if (dbContext == null){dbContext = new WebAppEntities();CallContext.SetData("dbContext", dbContext);}return dbContext;}}此用法像極了 Cache(緩存)的使用 。
But,鑒于目前廣泛使用線程池的前提,線程在處理完一個(gè)請(qǐng)求之后,并沒(méi)有被銷(xiāo)毀,存儲(chǔ)在CallContext中的上下文對(duì)象也一直存在,如果是下一次拿出這個(gè)線程去處理另一個(gè)請(qǐng)求,這個(gè)上下文對(duì)象其實(shí)也在不斷的膨脹,只不過(guò)比全局的膨脹的稍微慢一些 。而且,有時(shí)候一個(gè)線程并不一定是拿去處理請(qǐng)求了,如果是服務(wù)器拿去處理其他的業(yè)務(wù),那就可能引發(fā)一些其他的問(wèn)題 。
這時(shí),或許我們可以考慮另一個(gè)方案,在ASP.NET中的HttpContext中有一個(gè)Items屬性,它也可以用來(lái)保存key-value,這就完美了,一次請(qǐng)求正好對(duì)應(yīng)著一個(gè)HttpContext,請(qǐng)求結(jié)束,它自動(dòng)釋放,EF上下文也就不存在了 。
因此,這里把上面代碼中的CallContext改為HttpContext.Current.Items:
public class DbContextFactory{public static DbContext CreateDbContext(){DbContext dbContext = HttpContext.Current.Items["dbContext"] as DbContext;if (dbContext == null){dbContext = new WebAppEntities();         HttpContext.Current.Items["dbContext"] = dbContext;}return dbContext;}}其實(shí),HttpContext這個(gè)類(lèi)和CallContext是有關(guān)聯(lián)的,查看源碼我們可以發(fā)現(xiàn):HttpContext.Current是通過(guò)CallContext.HostContext實(shí)現(xiàn)的 。
internal static Object Current {get {return CallContext.HostContext;}[SecurityPermission(SecurityAction.Demand, Unrestricted = true)]set {CallContext.HostContext = value;}}關(guān)于HttpContext.Current:ASP.NET會(huì)為每個(gè)請(qǐng)求分配一個(gè)線程,這個(gè)線程會(huì)執(zhí)行我們的代碼來(lái)生成響應(yīng)結(jié)果,即使我們的代碼散落在不同的地方(類(lèi)庫(kù)),線程仍然會(huì)執(zhí)行它們 。所以,我們可以在任何地方訪問(wèn)HttpContext.Current獲取到與當(dāng)前請(qǐng)求相關(guān)的HttpContext對(duì)象,畢竟這些代碼是由同一個(gè)線程來(lái)執(zhí)行的嘛,所以得到的HttpContext引用也就是那個(gè)與請(qǐng)求相關(guān)的對(duì)象 。因此,將HttpContext.Current設(shè)計(jì)成與當(dāng)前線程相關(guān)聯(lián)是合適的 。有關(guān)CallContext.HostContext的知識(shí)可以自行查閱資料,這里就不再贅述 。
剛剛提到UnitOfWork模式,我們完成了DbContext的線程上下文內(nèi)的唯一性,那么SaveChanges呢?嗯,我們可以基于之前的唯一性保證,來(lái)寫(xiě)一個(gè)SaveChanges的唯一入口 。


以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問(wèn)題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專(zhuān)業(yè)人士給予相關(guān)指導(dǎo)!

「愛(ài)刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助: