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. ecshop 首页调用指定类产品

    方法一.已测试成功 1.在/includes/lib_goods.php最底部增加以下代码 function index_get_cat_id_goods_best_list($cat_id = '' ...

  2. VPS的虚拟化技术—-XEN,KVM,OPENVZ

    市场上的VPS商家主要有 Xen ,KVM 和 OpenVZ 三种开源的虚拟化技术 Xen 是一个开放源代码虚拟机监视器,由剑桥大学开发.它打算在单个计算机上运行多达 100个满特征的操作系统.操作系 ...

  3. php 使用phpmailer 发送邮件(附带中文乱码的解决方法)

    下载phpmailer ,在程序里包含class.phpmailer.php 类  ,这里有中文乱码的解决方法 实例代码如下 <html> <head> <title&g ...

  4. JSTL标签用法 详解

    在JSP的开发中,迭代是经常要使用到的操作.例如,逐行的显示查询的结果等.在早期的JSP中,通常使用Scriptlets来实现Iterator或者Enumeration对象的迭代输出.现在,通过JST ...

  5. 【转】IOS --- OC与Swift混编

    群里大神发的网址,感觉有用就先收录了,暂时没时间看SWIFT,感觉代码简洁,但是可阅读性不是太高,有些代码让系统去判断类型,同样的,我们看代码的时候也得自己去判断类型,或许看多就习惯了,有时间再说吧, ...

  6. poj 3270(置换群)

    题意:给定n头母牛的脾气大小,然后让你通过交换任意两头母牛的位置使得最后的母牛序列的脾气值从小到大,交换两头母牛的代价是两个脾气之和,使得代价最小. 分析:以前做过一道题,只有一个地方和这道题不同,但 ...

  7. JVM参数汇总

    一.java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容:其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足 ...

  8. winform 下log4net简单应用示例及“缺少log4net引用”的处理方案

    1.添加应用log4net.dll 2.新增log4net.config文件,文件内容如下 <?xml version="1.0" encoding="utf-8& ...

  9. [转]linux 下使用dump和restore命令

    转自:http://blog.sina.com.cn/s/blog_63eb479a01011sdu.html dump 支持分卷和增量备份(所谓增量备份是指备份最近一次备份以来修改过的文件,也称差异 ...

  10. Prototype入门

    官网地址:http://prototypejs.org/ Prototype降低了客户端web编程的复杂性.为了解决现实存在的一些问题,Prototype对浏览器的脚本环境做了一些扩展,对原先笨拙的A ...