共计 2032 个字符,预计需要花费 6 分钟才能阅读完成。
有一个场景:一个抢购的我的项目,假如有 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)
{
//……..
}
如果不使用第二种方法的全局锁,不知各位大侠有没有好的解决办法,如果有,可能跟贴,非常感谢!