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

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. CentOS 6.5环境下使用HAProxy+apache实现web服务的动静分离

    HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持 ...

  2. iOS学习笔记之Reachability简单使用

    写在前面 在学习异步图片下载的Demo过程中,由于需要实时检测网路状态,因此用到了苹果提供的Reachability库.Reachability的功能包括:检测目标网络是否可用.检测当前网络的链接方式 ...

  3. SQLite Manager插件安装与使用(firefox)

    下载与安装: FireFox 插件:SQLite Manager可以管理你电脑上的任何 SQLite数据库.一个直观的目录树状来展示数据库的对象.通过提示对话来管理表.索引.视图和触发器.你能浏览和搜 ...

  4. List遍历三种方法:1.for 2.增强性for 3.迭代器

    package chapter09; import java.util.ArrayList;import java.util.Iterator;import java.util.List; /* * ...

  5. 设置JAVA环境变量

    export JAVA_HOME=/usr/local/jdkexport JRE_HOME=/usr/local/jdk/jreexport CLASSPATH=.:$JAVA_HOME/lib/d ...

  6. 使用Maven进行多模块拆分

    模块拆分是Maven经常使用的功能,简单梳理一下如何使用Maven进行多模块拆分, 只做归纳总结,网上资料很多,不再一步一步实际创建和部署. 建立Maven多模块项目 一个简单的Java Web项目, ...

  7. Python全局解释器锁

    超过十年以上,没有比解释器全局锁(GIL)让Python新手和专家更有挫折感或者更有好奇心.    Python的底层 要理解GIL的含义,我们需要从Python的基础讲起.像C++这样的语言是编译型 ...

  8. java:利用java的输入/输出流将一个文件的每一行+行号复制到一个新文件中去

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  9. 利用python将表格中的汉字转化为拼音

    缺少包时用pip install 进行安装,例如: pip install xlsxwriter   完成代码如下: #!/usr/bin/python #-*-coding:utf-8-*- #fr ...

  10. 020 RDD的理解

    一:源码介绍RDD 1.RDD介绍 五大特性,保证了Spark的扩展性,容错性等特性. A list of partitions ====> 一个许多分区的集合,分区中包含数据 A functi ...