ASP.NET 多次点击button后事件执行多次 并发解决 频繁操作解决办法
首先让我们体验一下频繁操作:
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后事件执行多次 并发解决 频繁操作解决办法的更多相关文章
- 点击Button后,执行MouseDown的过程(使用Call Stack观察很清楚)
Form1上放两个按钮Button1和Button2,默认输入焦点是Button1,现在点击Button2,产生WM_LBUTTONDOWN消息 procedure TForm1.Button2Mou ...
- 点击button后刷新了页面
今天遇到一个特别奇怪的事,在页面中使用button标签,添加了点击事件onclic,点击的时候倒是执行了绑定的方法,但页面被刷新了! 什么鬼?我没与提交表单啊! 原来,button默认具有提交表单的动 ...
- 点击button传递消息,但是页面不跳转的解决方法
最近在做一个物联网的项目时遇到的问题:界面上有很多控制开/关灯的button,通过点击button来控制各个灯的亮灭.我需要将获取的不同的点击事件消息,以Socket通信的方式发送给硬件端的服务监听程 ...
- 点击TButton后的执行OnClick和OnMouseDown两个事件的过程(其实是通过WM_COMMAND执行程序员的代码)
问题的来源:在李维的<深入浅出VCL>一书中提到了点击TButton会触发WM_COMMAND消息,正是它真正执行了程序员的代码.也许是我比较笨,没有理解他说的含义.但是后来经过追踪代码和 ...
- [html]点击button后画面被刷新原因:未设置type="button"
一.问题原因解析: 在form表单里的button, type 属性未设置的情况下,Internet Explorer 的默认类型是 "button",而其他浏览器中(包括 W3C ...
- 点击 Button触发事件将GridView1 CheckBox勾选的行添加到GridView2中
有时候想实现一个CheckBox选取功能,但是很多细节不是很清楚 相信大家都有遇到类似的情况,直接看代码,如下: 前端代码GridView1,CheckBox控件设置 <asp:GridView ...
- Spring初始化完成后直接执行一个方法,初始化数据(解决方法被重复执行两次的情况)
在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听.Servlet加载初始化等切入点为数据库准备数据,这些初始化数据 是系统开始运行前必须的数据,例如权限组.系统选项.默认管理员等等.但是项 ...
- 点击button触发onclick事件判空后依旧自动跳转
这是一个前端的问题. 其中判断字符串为空的脚本代码是这样的: var remark = $("#Remark").val(); //判空.注意:var reg = /空格/g; v ...
- 点击单选button后的文字就可以选定相应单选button
比方我想点击单选button后的文字就选中对应的button: <input type="radio" name="sex" value="1& ...
随机推荐
- 利用jstack命令定位占用cpu高的java线程及具体错误代码信息
1.先用top查询某进程的线程CPU占用情况,定位到cpu占用高的进程pid 2.根据pid定位具体的线程top -p PID -H ,找出占用cpu最大的pid,此处占用cpu比较平均,我们随便选择 ...
- activiti报错ProcessEngines.getDefaultProcessEngine()为null
activiti报错ProcessEngines.getDefaultProcessEngine()为null 文件名错误,默认加载classpath下面的activiti.cfg.xml,而不是ac ...
- js检测当前设备是移动端还是PC端
加上下面js即可 硬核判断: <script type="text/javascript"> //平台.设备和操作系统 var system ={ win : fals ...
- Quartz 定时邮件发送多个备份文件
项目代码 pom.xml 文件Quartz 的包是整个项目不可缺少的 <properties> <!-- Spring的版本 --> <springframework.v ...
- VSCode配置python调试环境
VSCode配置python调试环境 很久之前的一个东东,翻出来看看 VSCode配置python调试环境 * 1.下载python解释器 * 2.在VSCode市场中安装Python插件 * 4.在 ...
- listbox或datagrid内容双击事件绑定
====listbox=== <DataTemplate> <Border Width="350" Height="230" Margin=& ...
- Hibernate的CRUD以及junit测试
Hibernate的CRUD以及junit测试 1:第一步创建动态工程引包,省略. 2:第二步,创建数据库和数据表,省略. 3:第三步,创建实体类,如User.java,源码如下所示: 对于实体类,一 ...
- Linux学习 用户管理
0.新建用户 sudo useradd -d /home/zookeeper -m zookeeper -d 指定用户组目录 -m 如果前面指定的用户组目录不存在,就创建改目录 passwd 1./e ...
- k短路([SDOI2010]魔法猪学院)
题解: A*来做 首先对终点向外面跑一遍最短路 然后从起点开始dfs 按照估价函数建立小根堆 每次取出最小的那个继续更新 每次更新到终点cnt++直道cft=k为止 那估价函数怎么弄呢? 其实就是终点 ...
- [SDOI2014]数数
题解: 做过ac自动机上dp的这题应该就很容易想到了 首先在ac自动机上搞dp 表示当前考虑了i位,在自动机的j位上 然后转移就可以了 考虑限制 显然是一个数位dp 考虑位数小于n显然满足要求 考虑位 ...