首先让我们体验一下频繁操作:

1)打开项目,在后台aspx.cs等服务器页面,设置断点.

2)点击页面按钮

3)调试开始进入断点,然后重复点击页面按钮

4)服务器第一次事件已经处理完毕,调试再次进入了断点,然后再进行处理

然后就出现了多条数据的新增问题.

使用lock也将无法解决该问题.因为lock是解决并发问题的,不是解决频繁操作的问题的.

因此这里我要说一下并发操作和频繁操作.并发是多个线程同时进行操作,频繁操作是指一个操作未响应到客户端,另一个操作再次重复进行,它们是2个不同的概念.

并发问题处理方法

大家可能很熟悉这个代码:

public class Singleton
{
private volatile static Singleton _instance = null;
private static readonly object lockHelper = new object();
private Singleton(){}
public static Singleton CreateInstance()
{
if(_instance == null)
{
lock(lockHelper)
{
if(_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
}

对于并发,我们主要做的事情是:让一个线程跑完之后再跑另一个线程,因此需要加锁

加锁使用了lock关键字,lock就是把{}中的代码段锁定,防止多个线程同时运行该代码段.

我们一般对于普通并发,使用lock就可以解决了,但是如果是秒杀的这种情况呢。

我们这时候需要使用队列集合去进行操作.

频繁操作处理方法:

我们想象一下:第一次点击按钮,假设生成了一个操作会话OperSA1,服务器执行第一次按钮操作的事件,执行未完成时,再次点击该按钮,

生成第2个操作会话OperSA2,服务器操作等待中.第一次按钮事件操作完成之后,客户端还没有响应这时候服务器就忙着执行第2次按钮事件了。

我们认为服务器执行操作是有错的,错在第1次按钮事件执行完成之后没有立即响应给客户端就执行第2次操作了。可是服务器认为它本身是没有错的。

它认为错的是客户端,客户端操作频繁了。这时候怎么办呢?

我们不如给服务器和客户端定一个操作约定:

在客户端定义一个会话标识符OperFrequent,如果客户端执行了第一次操作,则会话标识符OperFrequent生成标识,如果客户端再次执行了操作,但是会话标识符标识已经生成,则终止该操作。这是客户端的约定。

服务器在接到请求后,执行操作,操作完成后,清理客户端标识符。这是服务器的约定。

所以服务器必须在实际响应客户端之后才能修改客户端的会话标识符。

代码:

会话标识符定义:

responseVal就是OperFrequent

<input type="hidden" id="responseVal" value="none" runat="server" />

客户端执行操作:

if (document.getElementById('responseVal').value == 'none') {
document.getElementById('responseVal').value = 'change';
// 触发服务器事件
}

服务器响应操作:

this.responseVal.Value = "none";

ASP.NET 多次点击button后事件执行多次 并发解决 频繁操作解决办法的更多相关文章

  1. 点击Button后,执行MouseDown的过程(使用Call Stack观察很清楚)

    Form1上放两个按钮Button1和Button2,默认输入焦点是Button1,现在点击Button2,产生WM_LBUTTONDOWN消息 procedure TForm1.Button2Mou ...

  2. 点击button后刷新了页面

    今天遇到一个特别奇怪的事,在页面中使用button标签,添加了点击事件onclic,点击的时候倒是执行了绑定的方法,但页面被刷新了! 什么鬼?我没与提交表单啊! 原来,button默认具有提交表单的动 ...

  3. 点击button传递消息,但是页面不跳转的解决方法

    最近在做一个物联网的项目时遇到的问题:界面上有很多控制开/关灯的button,通过点击button来控制各个灯的亮灭.我需要将获取的不同的点击事件消息,以Socket通信的方式发送给硬件端的服务监听程 ...

  4. 点击TButton后的执行OnClick和OnMouseDown两个事件的过程(其实是通过WM_COMMAND执行程序员的代码)

    问题的来源:在李维的<深入浅出VCL>一书中提到了点击TButton会触发WM_COMMAND消息,正是它真正执行了程序员的代码.也许是我比较笨,没有理解他说的含义.但是后来经过追踪代码和 ...

  5. [html]点击button后画面被刷新原因:未设置type="button"

    一.问题原因解析: 在form表单里的button, type 属性未设置的情况下,Internet Explorer 的默认类型是 "button",而其他浏览器中(包括 W3C ...

  6. 点击 Button触发事件将GridView1 CheckBox勾选的行添加到GridView2中

    有时候想实现一个CheckBox选取功能,但是很多细节不是很清楚 相信大家都有遇到类似的情况,直接看代码,如下: 前端代码GridView1,CheckBox控件设置 <asp:GridView ...

  7. Spring初始化完成后直接执行一个方法,初始化数据(解决方法被重复执行两次的情况)

    在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听.Servlet加载初始化等切入点为数据库准备数据,这些初始化数据 是系统开始运行前必须的数据,例如权限组.系统选项.默认管理员等等.但是项 ...

  8. 点击button触发onclick事件判空后依旧自动跳转

    这是一个前端的问题. 其中判断字符串为空的脚本代码是这样的: var remark = $("#Remark").val(); //判空.注意:var reg = /空格/g; v ...

  9. 点击单选button后的文字就可以选定相应单选button

    比方我想点击单选button后的文字就选中对应的button: <input type="radio" name="sex" value="1& ...

随机推荐

  1. spring mvc 返回类型

    spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void 小结:1.使用 String 作为请求处理方 ...

  2. centos6.5环境下zookeeper-3.4.6集群环境部署及单机部署详解

    centos6.5环境下Zookeeper-3.4.6集群环境部署 [系统]Centos 6.5 集群部署 [软件]准备好jdk环境,此次我们的环境是open_jdk1.8.0_101 zookeep ...

  3. 转载:《理解RESTful架构》 阮一峰

    原文:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件&q ...

  4. Java中的钩子方法

    钩子方法是啥 钩子顾名思义就是用来挂东西的.那么要挂东西必须有个被挂的东西,要不就是铁环.要不就是墙的边沿.所以要能挂住东西必须要有个被勾住的铁环,要一个钩子.那么在java中也是同样的原理,你首先需 ...

  5. poj 3903 poj 2533 (LIS模板题)

    pi1 < pi2 < ... < pik, with i1 < i2 < ... < ik. Sample Input 6 5 2 1 4 5 3 3 1 1 1 ...

  6. thinkphp自定义分页类

    先来看下这个分页的样式,没写css,确实丑 什么时候写样式再来上传下css吧...... 就是多一个页面跳转功能 先把这个代码贴一下 <?php namespace Component; cla ...

  7. HTTP 的长连接和短连接

    一.什么是长连接 HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包.不四次握手),等待 ...

  8. 什么是AOP?

    AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封装.继承和 ...

  9. 快速幂-hdu1097

    题目描述: 题目大意:给出两个数,求出a^b的最后一个数字. 代码实现: #include<stdio.h> using namespace std; int pow(int a,int ...

  10. ListView优化中的细节问题

    1.android:layout_height属性: 必须将ListView的布局高度属性设置为非“wrap_content”(可以是“match_parent /  fill_parent  /   ...