我的API接口里有防重判断,测试没问题,前端也加入了防重点击的功能,为什么还是挡不住!
说明测试没问题这个判断是有问题的。
判断肯定没问题的。
会不会我加的这个锁不起作用?
@skybirdzw: 直接给判定过程lock不就行了
@花飘水流兮: 虽然我以前很随意用过lock,但现在觉得有点问题:每一个请求IIS都会分配一个线程去处理,而WEB站点本身就是一个线程,那岂不是站点被复制了N多份? HTTP请求和站点是一对一的关系?
要是这样的话,lock也不起作用啊!
@skybirdzw: work 线程 池。站点是进程。可以写个通讯(多客户端的,比如rs232是单客户端)试试就清楚了。连接线程 协议解析,然后扔到work池,弹出再到写进连接。
也有多进程的。各家细节不一样,大致过程一样。
首先你要知道MethodImpl 是如何保持同步的。
MethodImpl 是对每个实例进行同步的,
首先了解MethodImpl的具体原理和规则;
还有建议将锁范围只用在判断是否存在逻辑到插入成功范围,否则过多的包括不相干的逻辑会大大影响性能!
在防重判断那里加个锁,类似懒汉单例的实现:
if(info != null)
{
lock(obj)
{
if(info!=null)
{
xxxxxx
}
}
}
类似这样的。
查文档,如果是实例,就是当前实例上同步。
对于你这种高并发的,你这样代码里面的防重处理没有效果。
你改成lock(一个静态对象实例) 就可以了。
类为你想要的效果就是所有的请求都在这个方法上同步嘛。