异步 HttpContext.Current实现取值的方法(解决异步Application,Session,Cache...等失效的问题)

摘要:
=null){return"恭喜,中大奖呀";}else{return"我猜你快中奖了";}}

在一个项目中,为了系统执行效率更快,把一个经常用到的数据库表通过dataset放到Application中,发现在异步实现中每一次都会出现HttpContext.Current为null的异常,后来在网上查了好多资料,发现问这个问题的人多,回答的少,回答的也多数都是:引用System.Web,不要用HttpContext.Current.Application应该用System.Web.HttpContext.Current.Application,后来在网上看到一篇关于System.Runtime.Remoting.Messaging.CallContext这个类的详细介绍才知道,原来HttpContext.Current是基于System.Runtime.Remoting.Messaging.CallContext这个类,子线程和异步线程都无法访问到主线程在CallContext中保存的数据。所以在异步执行的过程会就会出现HttpContext.Current为null的情况,为了解决子线程能够得到主线程的HttpContext.Current数据,需要在异步前面就把HttpContext.Current用HttpContext的方式存起来,然后能过参数的形式传递进去,下面看看实现的方法:

public HttpContext context
{
get { return HttpContext.Current; }
set { context = value ; }
}
然后建立一个委托
public delegate string delegategetResult(HttpContext context);

下面就是实现过程的编码

protectedvoidPage_Load(objectsender,EventArgse)
{
context
=HttpContext.Current;
delegategetResultdgt
=testAsync;
IAsyncResultiar
=dgt.BeginInvoke(context,null,null);
stringresult=dgt.EndInvoke(iar);
Response.Write(result);
}
publicstaticstringtestAsync(HttpContextcontext)
{
if(context.Application["boolTTS"]==null)
{
Hashtableht
=(Hashtable)context.Application["TTS"];
if(ht==null)
{
ht
=newHashtable();
}
if(ht["A"]==null)
{
ht.Add(
"A","A");
}
if(ht["B"]==null)
{
ht.Add(
"B","B");
}
context.Application[
"TTS"]=ht;
}
Hashtablehts
=newHashtable();
hts
=(Hashtable)context.Application["TTS"];
if(hts["A"]!=null)
{
return"恭喜,中大奖呀";
}
else
{
return"我猜你快中奖了";
}
}

免责声明:文章转载自《异步 HttpContext.Current实现取值的方法(解决异步Application,Session,Cache...等失效的问题)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【mysql】Innodb三大特性之adaptive hash index傅里叶级数展开下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

消息机制、子窗口和父窗口的消息传递

1. 什么是窗口 MSDN: In a graphical Win32-based application, a window is a rectangular area of the screen where the application displays output and receives input from the user. Theref...

iOS UI-线程(NSThread)及其安全隐患与通信

一、基本使用 1.多线程的优缺点 多线程的优点 能适当提高程序的执行效率 能适当提高资源利用率(CPU、内存利用率) 多线程的缺点 开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能 线程越多,CPU在调度线程上的开销就越大 程序设计更加复杂:比如线程之间的通信、多线...

谷歌浏览器 html5的声音和视频不能自动播放处理

AI模型开发就选MindSpore!新特性、新工具上线!>>> 声音无法自动播放这个在IOS/Android上面一直是个惯例,桌面版的Safari在2017年的11版本也宣布禁掉带有声音的多媒体自动播放功能,紧接着在2018年4月份发布的Chrome 66也正式关掉了声音自动播放,也就是说<audio autopaly><...

多线程实现数据库的并发操作

在Java中,程序需要操作数据库,操作数据首要事就是要获得数据库的Connection对象,利用多线程对数据导入数据库中将会加快操作进度,但是多个线程共享Connection对象,是不安全的,因为可以利用Java中的ThreadLocal为每个线程保存一个Connection对象,代码如下: package com.quar.innovation.db;...

Java任务调度

四种任务调度的 Java 实现: Timer ScheduledExecutor 开源工具包 Quartz 开源工具包 JCronTab Timer 相信大家都已经非常熟悉 java.util.Timer 了,它是最简单的一种实现任务调度的方法,下面给出一个具体的例子: 清单 1. 使用 Timer 进行任务调度 package com.ibm.s...

VS调试技巧

下面有从浅入深的6个问题,您可以尝试回答一下 一个如下的语句for (int i = 0; i < 10; i++){if (i == 5)j = 5;},什么都写在一行,你怎么在j=5前面插入断点 在一个1000次的循环体内部设置断点,你希望当循环进行到900次后中断,怎么才能做到呢? 你有一个表达式在上面循环的某一次发生了变化,你想知道是哪一次...