C#队列(Queue)解说及使用

前端老王 2020/7/18 21:03:43

有一个场景:一个抢购的项目,假设有5件产品,谁先抢到谁能够买,但是假如此时此刻(这儿的此时此刻假设是相同的时刻),有100人去抢这个产品,假如运用平常的办法会出现什么情况呢?你懂的,这儿所说是便是有关并发的问题。  平常咱们去超市购物去结账的时候便是排队,…

  有一个场景:一个抢购的项目,假设有5件产品,谁先抢到谁能够买,但是假如此时此刻(这儿的此时此刻假设是相同的时刻),有100人去抢这个产品,假如运用平常的办法会出现什么情况呢?你懂的,这儿所说是便是有关并发的问题。
  平常咱们去超市购物去结账的时候便是排队,这儿咱们先让抢购人排好队,按时刻,谁先点击的抢购按钮谁就排在前面,这样就形成了一个行列,然后咱们再对这个行列处理,这样就不会出现并发的问题了。(至少能够处理这样简略的并发,这儿不评论太复杂的并发)
  事例:
  要求:有一个发布文章的接口,每发布一篇文章,调用一下接口。(这儿不必批量发布,为了解说这个)
  建立一个这样的处理程序类,BusinessInfoHelper.csC#
  [C#]纯文本检查
  [/size]
  [size=3]namespaceMyNameSpace
  {
  //行列临时类
  publicclassQueueInfo
  {
  publicstringmedias{get;set;}
  publicstringproids{get;set;}
  publicstringhost{get;set;}
  publicstringuserid{get;set;}
  publicstringfeedid{get;set;}
  }
  publicclassBusinessInfoHelper
  {
  #region解决发布时含有优质媒体时,前台页面卡住的现象
  //原理:运用生产者消费者模式进行入列出列操作
  publicreadonlystaticBusinessInfoHelperInstance=newBusinessInfoHelper();
  privateBusinessInfoHelper()
  {}
  privateQueueListQueue=newQueue();
  publicvoidAddQueue(stringmedias,stringproids,stringhost,stringuserid,stringfeedid)//入列
  {
  QueueInfoqueueinfo=newQueueInfo();
  queueinfo.medias=medias;
  queueinfo.proids=proids;
  queueinfo.host=host;
  queueinfo.userid=userid;
  queueinfo.feedid=feedid;
  ListQueue.Enqueue(queueinfo);
  }
  publicvoidStart()//启动
  {
  Threadthread=newThread(threadStart);
  thread.IsBackground=true;
  thread.Start();
  }
  privatevoidthreadStart()
  {
  while(true)
  {
  if(ListQueue.Count>0)
  {
  try
  {
  ScanQueue();
  }
  catch(Exceptionex)
  {
  LO_LogInfo.WLlog(ex.ToString());
  }
  }
  else
  {
  //没有使命,歇息3秒钟
  Thread.Sleep(3000);
  }
  }
  }
  //要执行的办法
  privatevoidScanQueue()
  {
  while(ListQueue.Count>0)
  {
  try
  {
  //从行列中取出
  QueueInfoqueueinfo=ListQueue.Dequeue();
  //取出的queueinfo就能够用了,里面有你要的东西
  //以下便是处理程序了
  //。。。。。。
  }
  catch(Exceptionex)
  {
  throw;
  }
  }
  }
  #endregion
  }
  }
  以上页面写好后,在程序开始运行时就得启动这个线程去不断的处理使命,那么咱们在Global的Application_Start里能够这样写:
  [C#]纯文本检查
  //启动发布优质媒体程序
  MyNameSpace.BusinessInfoHelper.Instance.Start();
  有一个问题出来了,假如我处理完行列中的一条记载后,想返回这条记载的ID,这个程序如同不能完结,我就运用了另一个办法Lock办法,把办法确定,具体的如下:
  在页面中界说全局的锁:
  [C#]纯文本检查
  privatestaticobjectlockObject=newObject();
  在办法中这样调用:
  [C#]纯文本检查
  lock(lockObject)
  {
  //……..
  }
  假如不运用第二种办法的全局锁,不知各位大侠有没有好的解决办法,假如有,能够跟贴,非常感谢!

随时随地学软件编程-关注百度小程序和微信小程序
关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[C#队列(Queue)解说及使用]http://www.zyiz.net/tech/detail-144168.html

上一篇:ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解

下一篇:C#使用反射访问对象属性方法

赞(0)

共有 条评论 网友评论

验证码: 看不清楚?
    关注微信小程序
    程序员编程王-随时随地学编程

    扫描二维码或查找【程序员编程王】

    可以随时随地学编程啦!

    技术文章导航 更多>
    扫一扫关注最新编程教程