Net Core教程

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

本文主要是介绍C#队列(Queue)解说及使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  有一个场景:一个抢购的项目,假设有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)
  {
  //……..
  }
  假如不运用第二种办法的全局锁,不知各位大侠有没有好的解决办法,假如有,能够跟贴,非常感谢!

这篇关于C#队列(Queue)解说及使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!