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