多用户同时调用Webserivce端口方法

SeeYou孙悟空 2016-09-05 05:30:24
手机App,调用取号方法。存在某种情况,就是可能同时几个人一起点击了取号,而数据库中的号源是,1,2,3,4,5.。。。依次类推,假如5个人同时点击取号,那么我就得自动分配号源, 5个人分别 分配1-5号 这个5号码,返回出来。。。


问题:App端他肯定是不做控制的,所有操作都在服务端,那么什么情况下,才能依次获取到5个号码,并且不会重复?

1.我在服务端使用了lock(obj)不行,取号时,返回的都是5个重复的号,2. 使用队列,感觉没法控制住 5个点击同时进入 取号
3.多线程控制, 进来一次开始一个线程?好像不行。。。


我最终的完美想法是,5个人同时点击,第一个人取号到1,取号方法结束,第二个人再进行取号,类似排队。。。。


不知道大家有什么好的想法没有。。。就教


类似模板:
WS_cebservice.cebservice ceb = new WS_cebservice.cebservice();
string xml = ceb.Order("", "", str.ToString());


str 为我传入XML串,来获取某个时段的号码,xml为我返回的号码。 请问如何控制



...全文
210 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
SeeYou孙悟空 2016-09-07
  • 打赏
  • 举报
回复
结贴,还是靠自己解决。另外2楼说的方法没有控制住,爱信不信。
mwp 2016-09-07
  • 打赏
  • 举报
回复
最简单的受限资源访问问题。
xiaha3 2016-09-06
  • 打赏
  • 举报
回复
不知道你为啥lock不好使,不会用就用queue,c#自带的队列类,进队和出队本身是线程安全的,多线程情况下也能保证出队顺序
wanghui0380 2016-09-06
  • 打赏
  • 举报
回复
??排啥队??悲观锁定就好
飞天凤凰601 2016-09-06
  • 打赏
  • 举报
回复
我觉得你设计思路有问题,为什么要先有号,再取呢? 为何不是每个人来取号时,再产生号,把数据写入表,再根据表产生自动ID, 把这个ID作为取号, 不行吗?
software_artisan 2016-09-05
  • 打赏
  • 举报
回复
定义一个集合,来一个人就把他的ID放到集合里面去,然后返回当前集合的Count不就行了? 当然,这个操作需要做一个线程同步,保证同一时间只有一个线程在操作这个集合,因为WebService的接口基本上都是多线程的。
Poopaye 2016-09-05
  • 打赏
  • 举报
回复
这种计数操作都是自己写服务,然后去取 也可以考虑用redis这种来处理
sp1234_maJia 2016-09-05
  • 打赏
  • 举报
回复
你在问题1 中所作为根据的 lock(obj) 的说法不能落地,暴露出你并没有学会 lock 语句。这就好像一个人照猫画虎,明知道自己还不会画虎(没有对 lock 技术做过测试),硬要说“老虎本来就是这个屌样儿,一点都不凶猛“。 明明学了技术,一到用时完全不会写基本的编码模式。是很令人遗憾的。
  • 打赏
  • 举报
回复
除了编程语言本身的技术以外,基本上所有的商品化关系数据库的事务机制都是保证ACID互斥的。(这其实也是软件某个科目下的基本知识) 也就是说,假设你在你的 c# 程序中显示使用一个“事务”,例如 SqlTransaction,你去查询某表 select top 1 * ... where .... 记录,这时候事务就会为这个记录上了“防止读写锁”。那么另一个事务也就没有办法查询了、只能等待它结束。当你将这个记录的标志修改(或者删除这个记录),然后结束了事务之后,此时其它事务才有一个可以继续执行 select 语句。 因此关系数据库本身天然地也是互斥操作的——只要你知道你的查询和修改/删除动作应该放在一个 transaction 中。 但是一般来说,数据库操作很慢,而且它仅仅限于所有操作都限制于某一个数据库的场景。所以当程序中同步线程即可以更加完善地处理流程时,对数据库操作就没有必要太计较,例如你可以使用根本不支持(关系数据库的)事务操作的、高效率的 NoSql 数据库,或者内存数据库。把数据库进一步降级为尽可能简单、傻瓜的数据存储,对数据库系统功能不做更多假设和要求。
  • 打赏
  • 举报
回复
你所写的问题,尤其是第3点,是非常令人遗憾的。因为在应用进程中使用 lock 同步这是非常基本的知识,仅仅比“会用for循环、if 语句”等等的编程设计技能稍微高级一些而已。从此以后,不要再对这类简单问题产生类似的疑惑。
  • 打赏
  • 举报
回复
你是否理解在你的 asp.net (非集群的)网站上,所谓“类似排队。。。。”是个什么概念呢? 它就是类似
private static object lockFlag = new object();

void abc()
{
    .................
    ulong 编号;
    lock(lockFlag)
    {
        编号 = 查询数据库取号();
    }
    .................
}   
这样的代码,这就是排队。或者更加准确地说,叫做同步。 “排队”这个词儿被滥用了。准确地说,在 .net 中只需要同步功能,并不需要去煞有介事地去“排队”。

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧