2015-07-16 13:04 13265人阅读 评论(8) 收藏 举报
 分类:
Asp.Net(8) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

有一个场景:一个抢购的项目,假设有5件商品,谁先抢到谁可以买,但是如果此时此刻(这里的此时此刻假设是相同的时间),有100人去抢这个商品,如果使用平时的方法会出现什么情况呢?你懂的,这里所说是就是有关并发的问题。

平时我们去超市购物去结账的时候就是排队,这里我们先让抢购人排好队,按时间,谁先点击的抢购按钮谁就排在前面,这样就形成了一个队列,然后我们再对这个队列处理,这样就不会出现并发的问题了。(至少可以处理这样简单的并发,这里不讨论太复杂的并发)

案例:

要求:有一个发布文章的接口,每发布一篇文章,调用一下接口。(这里不用批量发布,为了讲解这个)

建立一个这样的处理程序类,BusinessInfoHelper.cs

  1. namespace MyNameSpace
  2. {
  3. //队列临时类
  4. public class QueueInfo
  5. {
  6. public string medias { get; set; }
  7. public string proids { get; set; }
  8. public string host { get; set; }
  9. public string userid { get; set; }
  10. public string feedid { get; set; }
  11. }
  12. public class BusinessInfoHelper
  13. {
  14. #region 解决发布时含有优质媒体时,前台页面卡住的现象
  15. //原理:利用生产者消费者模式进行入列出列操作
  16. public readonly static BusinessInfoHelper Instance = new BusinessInfoHelper();
  17. private BusinessInfoHelper()
  18. { }
  19. private Queue<QueueInfo> ListQueue = new Queue<QueueInfo>();
  20. public void AddQueue(string medias, string proids, string host, string userid, string feedid) //入列
  21. {
  22. QueueInfo queueinfo = new QueueInfo();
  23. queueinfo.medias = medias;
  24. queueinfo.proids = proids;
  25. queueinfo.host = host;
  26. queueinfo.userid = userid;
  27. queueinfo.feedid = feedid;
  28. ListQueue.Enqueue(queueinfo);
  29. }
  30. public void Start()//启动
  31. {
  32. Thread thread = new Thread(threadStart);
  33. thread.IsBackground = true;
  34. thread.Start();
  35. }
  36. private void threadStart()
  37. {
  38. while (true)
  39. {
  40. if (ListQueue.Count > 0)
  41. {
  42. try
  43. {
  44. ScanQueue();
  45. }
  46. catch (Exception ex)
  47. {
  48. LO_LogInfo.WLlog(ex.ToString());
  49. }
  50. }
  51. else
  52. {
  53. //没有任务,休息3秒钟
  54. Thread.Sleep(3000);
  55. }
  56. }
  57. }
  58. //要执行的方法
  59. private void ScanQueue()
  60. {
  61. while (ListQueue.Count > 0)
  62. {
  63. try
  64. {
  65. //从队列中取出
  66. QueueInfo queueinfo = ListQueue.Dequeue();
  67. //取出的queueinfo就可以用了,里面有你要的东西
  68. //以下就是处理程序了
  69. //。。。。。。
  70. }
  71. catch (Exception ex)
  72. {
  73. throw;
  74. }
  75. }
  76. }
  77. #endregion
  78. }
  79. }

以上页面写好后,在程序开始运行时就得启动这个线程去不停的处理任务,那么我们在Global的Application_Start里可以这样写:

  1. //启动发布优质媒体程序
  2. MyNameSpace.BusinessInfoHelper.Instance.Start();

有一个问题出来了,如果我处理完队列中的一条记录后,想返回这条记录的ID,这个程序好像不能完成,我就使用了另一个方法 Lock方法 ,把方法锁定,具体的如下,

在页面中定义全局的锁:

  1. private static object lockObject= new Object();

在方法 中这样调用:

  1. lock(lockObject)
  2. {
  3. //........
  4. }

如果不使用第二种方法的全局锁,不知各位大侠有没有好的解决办法,如果有,可以跟贴,非常感谢!

(C#)使用队列(Queue)解决简单的并发问题的更多相关文章

  1. 利用队列Queue实现一个多并发“线程池”效果的Socket程序

    本例通过利用类Queue建立了一个存放着Thread对象的“容器对象”,当Client端申请与Server端通信时,在Server端的“链接循环”中每次拿出一个Thread对象去创建“线程链接”,从而 ...

  2. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  3. 使用队列queue实现一个简单的生产者消费者模型

    一.生产者消费者模型 我们去超市商店等地购买商品时,我们大部分人都会说自己是消费者,而超市的各大供货商.工厂等,自然而然地也就成了我们的生产者.如此一来,生产者有了,消费者也有了,那么将二者联系起来的 ...

  4. C#队列Queue实现一个简单的电商网站秒杀程序

    电商的秒杀和抢购,对程序员来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要. 我们 ...

  5. threading模块和queue模块实现程序并发功能和消息队列

    简介: 通过三个例子熟悉一下python threading模块和queue模块实现程序并发功能和消息队列. 说明:以下实验基于python2.6 基本概念 什么是进程? 拥有独立的地址空间,内存,数 ...

  6. java-Enumeration,单向队列Queue及双向队列Deque等容器简单使用

    1.Enumeration容器使用: package com.etc; import java.util.Enumeration; import java.util.Vector; /* Enumer ...

  7. [b0027] python 归纳 (十二)_并发队列Queue的使用

    # -*- coding: UTF-8 -*- """ 学习队列 Queue 总结: 1. 队列可以设置大小,也可以无限大小 2. 空了,满了,读写时可以阻塞,也可以报错 ...

  8. 【java】Java多线程总结之线程安全队列Queue【转载】

    原文地址:https://www.cnblogs.com/java-jun-world2099/articles/10165949.html ============================= ...

  9. C# 队列Queue,ConcurrentQueue,BlockingCollection 并发控制lock,Monitor,信号量Semaphore

    什么是队列? 队列Queues,是一种遵循先进先出的原则的集合,在.netCore中微软给我们提供了很多个类,就目前本人所知的有三种,分别是标题提到的:Queue.ConcurrentQueue.Bl ...

随机推荐

  1. 关闭iptables(Centos)

    由于搭建了CDH-Hadoop,方便起见,事先关闭了防火墙: services iptables stop; chkconfig iptables off; services ip6tables st ...

  2. 【转】linux设备驱动程序之简单字符设备驱动

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/03/2272869.html 一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用 ...

  3. activity_main.xml与fragment_main.xml

    见: http://blog.sina.com.cn/s/blog_3e28c8a50101fqvw.html http://blog.sina.com.cn/s/blog_3e28c8a50101f ...

  4. WebAPI 时代

    引言 小编跳槽到现任公司有一段时间,在这个公司对于小编是各种挑衅啊,也颠覆了小编之前的编程生涯,在前面 的博客中小编隆重介绍了angularJS这个大神,这个让我不堪回首的两周,真是黑色天使啊!从现在 ...

  5. spring mvc 异常统一处理方式

    springMVC提供的异常处理主要有两种方式: 一种是直接实现自己的HandlerExceptionResolver: 另一种是使用注解的方式实现一个专门用于处理异常的Controller——Exc ...

  6. Delphi RxRichEdit高级操作

    unit InsertRichEditUnit;interfaceuses  Windows, Messages, SysUtils, Classes, Graphics, Controls, For ...

  7. 上传Test Result和attachment到ALM

    之前在HP的时候用ALM,还是很好用的功能很强大的一个测试管理工具,当时用C#依照ALM的API实现了一个上传测试结果的程序,现在贴出来: 这个程序的使用方式很自由,使得ALM几乎可以和所有测试工具做 ...

  8. Android百度地图开发(五)公交线路详情搜索、多条线路显示

    一.公交线路详情检索 获取公交线路的详情主要分来两步,1.获取公交线路的Uid,2.通过Uid获取公交线路详情. 1.获取公交线路的Uid: /* * 获得公交线路图的Uid,并且根据系Uid发起公交 ...

  9. 代码所见所得方式发布.xml

    pre{ line-height:1; color:#b836b3; background-color:#000000; font-size:16px;}.sysFunc{color:#19ef0b; ...

  10. jQuery对select标签的常用操作

    1.获取当前选中项的value. $("#selector").val(); 2.获取当前选中项的text. $("#selector").find(" ...