在一个项目中,为了系统执行效率更快,把一个经常用到的数据库表通过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);

下面就是实现过程的编码

protected void Page_Load(object sender, EventArgs e)
{
   context = HttpContext.Current;
   delegategetResult dgt = testAsync;
   IAsyncResult iar = dgt.BeginInvoke(context, null, null);
   string result = dgt.EndInvoke(iar);
   Response.Write(result);
}

public static string testAsync(HttpContext context)
{
    if (context.Application["boolTTS"] == null)
    {
        Hashtable ht = (Hashtable)context.Application["TTS"];
        if (ht == null)
        {
            ht = new Hashtable();
        }

if (ht["A"] == null)
        {
            ht.Add("A", "A");
        }

if (ht["B"] == null)
        {
            ht.Add("B", "B");
        }

context.Application["TTS"] = ht;
   }

Hashtable hts = new Hashtable();
   hts = (Hashtable)context.Application["TTS"];
   if (hts["A"] != null)
   {
      return "恭喜,中大奖呀";
   }
   else
   {
      return "我猜你快中奖了";
   }
}

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

  1. 异步 HttpContext.Current 为空null 另一种解决方法

    异步 HttpContext.Current 为空null 另一种解决方法 参考文章: (1)异步 HttpContext.Current 为空null 另一种解决方法 (2)https://www. ...

  2. Java中url传递中文参数取值乱码的解决方法

    Java中url传递中文参数取值乱码的解决方法 参考文章: (1)Java中url传递中文参数取值乱码的解决方法 (2)https://www.cnblogs.com/liwenjuan/p/3211 ...

  3. python权重是什么意思_在python带权重的列表中随机取值的方法

    1 random.choice python random模块的choice方法随机选择某个元素 foo = ['a', 'b', 'c', 'd', 'e'] from random import ...

  4. 循环map取值的方法

    [size=large][b] 循环map取值的方法,如下所示:[/b][/size] [b]方法一:[/b] [code="java"]Map<String, String ...

  5. Jquery操作Cookie取值错误的解决方法

    使用JQuery操作cookie时 发生取的值不正确,结果发现cookie有四个不同的属性,分享下错误的原因及解决方法. 使用JQuery操作cookie时 发生取的值不正确的问题:  结果发现coo ...

  6. HTML给表单元素赋值,JQuery表单元素取值赋值方法总结

    一.普通文本框的赋值与取值 1.1.1赋值 jQuery 表单元素取值与赋值方法总结 function get(){ var test1 = $("input.test1").va ...

  7. 关于matlab中矩阵取值的方法

    在matlab中,取出矩阵中某一个值的方法如下: 1.对于二维数组: a(i, j) % 表示取出二维数组a的第 i 行,第 j 列的数据 a(:, j) % 表示取出二维数组a的第 j 列的所有数据 ...

  8. matlab中矩阵取值的方法

    在matlab中,取出矩阵中某一个值的方法如下: 1.对于二维数组: a(i, j) % 表示取出二维数组a的第 i 行,第 j 列的数据 a(:, j) % 表示取出二维数组a的第 j 列的所有数据 ...

  9. vue 表格中有列需要异步加载_Vue中使用async/await解决异步请求问题

    1.async/await场景 用同步的思维来解决异步问题,当前端接口调用需要等到接口返回值以后渲染页面. 2.名词解释 async async的用法,它作为一个关键字放到函数前面,用于表示函数是一个 ...

最新文章

  1. android资源加载失败,Unity2017,打成安卓包之后加载资源失败
  2. 【Flask项目2】多进程下的日志文件(2)
  3. Android AIDL的实现
  4. java------多线程通信
  5. Java黑皮书课后题第7章:**7.17(对学生排序)编写一个程序,提示用户输入学生个数、学生姓名和他们的成绩,然后按照学生成绩的降序打印学生的姓名。假定姓名是不包含空格的字符,使用next()读取
  6. 获取指定包名下的所有类
  7. elasticsearch 的滚动(scroll)
  8. mysql一对一修改_MYSQL的一对一
  9. 关于构造函数和this调用的思考
  10. ipmitool 设置网关_IPMI 接口配置
  11. Android开发笔记(一百零三)地图与定位SDK
  12. mysql的连接池配置文件,数据库连接池/配置文件数据库连接池
  13. poi(easypoi)导出excel(xls,xlsx)后,文件打开错误或乱码的解决方法(亲测)
  14. 【转】Tapestry5和Eclipse的整合
  15. 解决Qt安装后没有桌面图标
  16. PHP实现文件下载两种方式(a标签和header标签)
  17. Pascal版2048
  18. 抓包工具Fiddler下载安装
  19. GetItemText
  20. python爬虫抓取头条街拍美女图片

热门文章

  1. html选择第一个clss,css3如何选择第一个子元素?
  2. 和县机电工程学校工业机器人_成都机电工程学校专业有哪些
  3. php 递归遍历文件夹,php递归遍历目录 | 学步园
  4. pytorch torch.tensor
  5. pytorch torch.nn.RNN
  6. Python AES
  7. 3.10 触发字检测
  8. 华为云公布2021产品上新计划,让云无处不在,让智能无所不及
  9. Exchange邮件跟踪日志不得不了解的知识
  10. Quartz学习总结(2)——定时任务框架Quartz详解