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