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& ...
随机推荐
- 现代C++之理解decltype
现代C++之理解decltype decltype用于生成变量名或者表达式的类型,其生成的结果有的是显而易见的,可以预测的,容易理解,有些则不容易理解.大多数情况下,与使用模板和auto时进行的类型 ...
- sysbench安装、对Mysql压力测试、结果解读及mysql数据库跟踪优化
sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试. sysbench支持以下几种测试模式: 1.CPU运算性能 2.磁盘IO性能 3.调度程序性 ...
- Ex 6_18 硬币有限的兑换问题_第七次作业
子问题定义: 定义一个二维数组b,其中b[i][j]表示前i个币种是否能兑换价格j,表示第i个币种的面值,第i个币种的使用有两种情况,若使用,则b[i][j]=b[i-1][j-],若不使用,则b[i ...
- 解决sdk更新时候报错 http://dl-ssl.google.com/android上不去,链接拒绝
解决国内访问Google服务器的困难: 启动 Android SDK Manager : 打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - ...
- nodejs服务器读取图片返回给前端(浏览器)显示
1 前言 项目需要用nodejs服务器给前端传递图片,网上找了好多资料,多数都是怎么在前端上传图片的,然后通过看runoob.com菜鸟教程,发现其实是非常简单,用express框架就行了. 2 代码 ...
- 追求极致--纯css制作三角、圆形按钮,兼容ie6
参考了天猫.微博等网站的做法,用纯html和css实现,效果还是不错的.以下是成果,兼容主流浏览器,包括ie6. <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- Vue.js学习笔记之修饰符详解
本篇将简单介绍常用的修饰符. 在上一篇中,介绍了 v-model 和 v-on 简单用法.除了常规用法,这些指令也支持特殊方式绑定方法,以修饰符的方式实现.通常都是在指令后面用小数点“.”连接修饰符名 ...
- django----用户认证(auth模块)
用法 from django.contrib import auth user = authenticate(username='someone',password='somepassword') l ...
- poj1015 01二维背包
/* 给定辩控双方给每个人的打分p[i],d[i], dp[j][k]表示前i个人有j个被选定,选定的人的辩控双方打分差之和是k,此状态下的最大辩控双方和 按01背包做,体积一维是1,体积二维是辩控双 ...
- bzoj2152 树分治
还是太菜了,自己写的wa,但是找不到哪里错了,, 感觉现在学树分治早了点..以后回来再看吧 /* 多少点对之间的路径是3的倍数 */ #include<iostream> #include ...