C#應用隊列(Queue)處理簡略的並提問題。本站提示廣大學習愛好者:(C#應用隊列(Queue)處理簡略的並提問題)文章只能為提供參考,不一定能成為您想要的結果。以下是C#應用隊列(Queue)處理簡略的並提問題正文
本文經由過程實例,更詳細的講授了隊列,隊列(Queue)代表了一個先輩先出的對象聚集。當您須要對各項停止先輩先出的拜訪時,則應用隊列。當您在列表中添加一項,稱為入隊,當您從列表中移除一項時,稱為出隊。
有一個場景:一個搶購的項目,假定有5件商品,誰先搶到誰可以買,然則假如此時此刻(這裡的此時此刻假定是雷同的時光),有100人去搶這個商品,假如應用日常平凡的辦法會湧現甚麼情形呢?你懂的,這裡所說是就是有關並發的成績。
日常平凡我們去超市購物去結賬的時刻就是列隊,這裡我們先讓搶購人排好隊,按時光,誰先點擊的搶購按鈕誰就排在後面,如許就構成了一個隊列,然後我們再對這個隊列處置,如許就不會湧現並發的成績了。(至多可以處置如許簡略的並發,這裡不評論辯論太龐雜的並發)
案例:
請求:有一個宣布文章的接口,每宣布一篇文章,挪用一下接口。(這裡不消批量宣布,為了講授這個)
樹立一個如許的處置法式類,BusinessInfoHelper.cs
namespace MyNameSpace
{
//隊列暫時類
public class QueueInfo
{
public string medias { get; set; }
public string proids { get; set; }
public string host { get; set; }
public string userid { get; set; }
public string feedid { get; set; }
}
public class BusinessInfoHelper
{
#region 處理宣布時含有優良媒體時,前台頁面卡住的景象
//道理:應用臨盆者花費者形式停止出列出列操作
public readonly static BusinessInfoHelper Instance = new BusinessInfoHelper();
private BusinessInfoHelper()
{ }
private Queue<QueueInfo> ListQueue = new Queue<QueueInfo>();
public void AddQueue(string medias, string proids, string host, string userid, string feedid) //出列
{
QueueInfo queueinfo = new QueueInfo();
queueinfo.medias = medias;
queueinfo.proids = proids;
queueinfo.host = host;
queueinfo.userid = userid;
queueinfo.feedid = feedid;
ListQueue.Enqueue(queueinfo);
}
public void Start()//啟動
{
Thread thread = new Thread(threadStart);
thread.IsBackground = true;
thread.Start();
}
private void threadStart()
{
while (true)
{
if (ListQueue.Count > 0)
{
try
{
ScanQueue();
}
catch (Exception ex)
{
LO_LogInfo.WLlog(ex.ToString());
}
}
else
{
//沒有義務,歇息3秒鐘
Thread.Sleep(3000);
}
}
}
//要履行的辦法
private void ScanQueue()
{
while (ListQueue.Count > 0)
{
try
{
//從隊列中掏出
QueueInfo queueinfo = ListQueue.Dequeue();
//掏出的queueinfo便可以用了,外面有你要的器械
//以下就是處置法式了
//。。。。。。
}
catch (Exception ex)
{
throw;
}
}
}
#endregion
}
}
以上頁面寫好後,在法式開端運轉時就得啟動這個線程去一直的處置義務,那末我們在Global的Application_Start裡可以如許寫:
//啟動宣布優良媒體法式
MyNameSpace.BusinessInfoHelper.Instance.Start();
有一個成績出來了,假如我處置完隊列中的一筆記錄後,想前往這筆記錄的ID,這個法式似乎不克不及完成,我就應用了另外一個辦法 Lock辦法 ,把辦法鎖定,詳細的以下,
在頁面中界說全局的鎖:
private static object lockObject= new Object();
在辦法中如許挪用:
lock(lockObject)
{
//........
}
以上是本文的全體內容,願望對年夜家進一步進修隊列有所贊助