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. php的类型约束

    //如下面的类 class MyClass { /** * 测试函数 * 第一个参数必须为 OtherClass 类的一个对象 */ public function test(OtherClass $ ...

  2. HDFS命令行文件操作

    Hadoop文件操作命令形式为 hadoop fs -cmd <args> 说明:cmd是具体的文件操作命令,<args>是一组数目可变的参数. Hadoop最常用的文件操作命 ...

  3. [Everyday Mathematics]20150302

    $$\bex |p|<\frac{1}{2}\ra \int_0^\infty \sex{\frac{x^p-x^{-p}}{1-x}}^2\rd x =2(1-2p\pi \cot 2p\pi ...

  4. 使用 Google Fonts 为网页添加美观字体

    前言 文字是网页中很重要的组成部分.为文字选择一个合适的字体,能够更好的展现一个网站的个性,表达所要传递的信息,同时吸引用户来产生兴趣. 说到字体,我们首先会想到 CSS 里面的 font,例如: & ...

  5. 【LeetCode 239】Sliding Window Maximum

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  6. 深入解读saltstack的安装及配置1

    安装 一.安装方法:http://www.linuxeye.com/Linux/2765.html 二.建议安装epel后安装saltstack:http://www.a8z8.com/html/20 ...

  7. javascript --- 面向对象 --- 封装

    javascript中有原型对象和实例对象 如有疑问请参考:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_enca ...

  8. 虚幻4以及DX12将允许开发者利用Xbox One的更多性能(转)

    GamingBolt 最近采访了 Epic Games 的总经理 Ray Davis,讨论了有关旗下虚幻引擎(Unreal Engine)的议题.在这次的访谈中,Ray 解释了关于使用 DirectX ...

  9. 谈谈final、finally和finalize

    final: final为修饰符, 如果类被声明为final,则不能派生新子类. 如果变量被声明为final,则必须在声明时初始化,在以后的引用只能读取,不可修改. 如果方法被final声明,则只能使 ...

  10. 线性时间内确定T[0:n]是否有一个主元素

    设T[0:n-1]是n 个元素的数组.对任一元素x,设S(x)={ i | T[i]=x}.当| S(x) |>n/2 时,称x 为T 的主元素.设计一个算法,确定T[0:n-1]是否有一个主元 ...