代码改变世界

网站[高并发]下使用[静态方法]会造成页面无法访问

2013-07-16 17:07  苏飞  阅读(3521)  评论(46编辑  收藏  举报

原文地址:http://www.sufeinet.com/thread-4281-1-1.html

 

委托delegate与Dictionary实现action选择器

大家先看看我上一次的文章

大致如下

 //定义一个委托
    private delegate void actionByMain(HttpContext context);
    //定义一Key,Value的键值对,大家注意这里把委托放进去了
    private static Dictionary<string, actionByMain> mainList = new Dictionary<string, actionByMain>();
    public void ProcessRequest(HttpContext context)
    {
        string action = string.Empty;
        if (string.IsNullOrEmpty(context.Request["action"]))
        {
            return;
        }
        action = context.Request["action"];
        //先检查一下有没有这个action
        if (mainList.ContainsKey(action))
        {
            mainList[action](context); return;
        }
    }
    //添加action对应方法的列表 构造器
    static addMainList()
    {
        mainList.Add("post1", delegate(HttpContext context)
       {
           context.Response.Write("成功");
       });
        mainList.Add("post2", delegate(HttpContext context)
      {
          context.Response.Write("成功");
      });
        mainList.Add("post3", delegate(HttpContext context)
      {
          return;
      });
    }

就是这样的写法,容易出现问题

在高并发的时候经常出现页面无法访问的问题

其实我也不敢确定是不是这里的问题但是有以下几点可以确定

可能会有人说,如果不使用这种而是直接调用静态方法呢,是一样的效果。这点我测试过。

换成普通类型


 

换成如下写法就不会出现这样的问题

//取出action的值
string action = context.Request["action"];
if (action == "post1")
{
   //调用第一个Post方法
}
else if (action == "post2")
{
   //调用第一个Post方法
}
else if (action == "post3")
{
   //调用第一个Post方法
}
else
{
   //调用在没有找到action对应方法时执行
}

方法如下

    private void post1()
    {

    }
    private void post2()
    {

    }
    private void post3()
    {

    }

访问量比较小时,本页面日访问量低于2万Pv的就不要测试了,应该不会有效果


 

   这个我经过测试确定是这样的

因为经过我们的测试,只要清理一下浏览器的缓存或者是重启电脑路由之后就基本上又可以正常访问了

这种现像很难解释啊,

所以没有办法后来我又修改成了。普通的写法。

大家讨论一下看看具体是那里的问题

我确实是解释不了这种现像了。