C#使用隊列(Queue)解決簡單的并發(fā)問題
本文通過實例,更具體的講解了隊列,隊列(Queue)代表了一個先進先出的對象集合。當您需要對各項進行先進先出的訪問時,則使用隊列。當您在列表中添加一項,稱為入隊,當您從列表中移除一項時,稱為出隊。
有一個場景:一個搶購的項目,假設有5件商品,誰先搶到誰可以買,但是如果此時此刻(這里的此時此刻假設是相同的時間),有100人去搶這個商品,如果使用平時的方法會出現(xiàn)什么情況呢?你懂的,這里所說是就是有關(guān)并發(fā)的問題。
平時我們?nèi)コ匈徫锶ソY(jié)賬的時候就是排隊,這里我們先讓搶購人排好隊,按時間,誰先點擊的搶購按鈕誰就排在前面,這樣就形成了一個隊列,然后我們再對這個隊列處理,這樣就不會出現(xiàn)并發(fā)的問題了。(至少可以處理這樣簡單的并發(fā),這里不討論太復雜的并發(fā))
案例:
要求:有一個發(fā)布文章的接口,每發(fā)布一篇文章,調(diào)用一下接口。(這里不用批量發(fā)布,為了講解這個)
建立一個這樣的處理程序類,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 解決發(fā)布時含有優(yōu)質(zhì)媒體時,前臺頁面卡住的現(xiàn)象 //原理:利用生產(chǎn)者消費者模式進行入列出列操作 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); } } } //要執(zhí)行的方法 private void ScanQueue() { while (ListQueue.Count > 0) { try { //從隊列中取出 QueueInfo queueinfo = ListQueue.Dequeue(); //取出的queueinfo就可以用了,里面有你要的東西 //以下就是處理程序了 //。。。。。。 } catch (Exception ex) { throw; } } } #endregion } }
以上頁面寫好后,在程序開始運行時就得啟動這個線程去不停的處理任務,那么我們在Global的Application_Start里可以這樣寫:
//啟動發(fā)布優(yōu)質(zhì)媒體程序? MyNameSpace.BusinessInfoHelper.Instance.Start();?
有一個問題出來了,如果我處理完隊列中的一條記錄后,想返回這條記錄的ID,這個程序好像不能完成,我就使用了另一個方法 Lock方法 ,把方法鎖定,具體的如下,
在頁面中定義全局的鎖:
private static object lockObject= new Object();?
在方法中這樣調(diào)用:
lock(lockObject)? ? {? ? //........? ? }?
以上是本文的全部內(nèi)容,希望對大家進一步學習隊列有所幫助
相關(guān)文章
C#/VB.NET?將Word與Excel文檔轉(zhuǎn)化為Text
這篇文章主要介紹了C#/VB.NET?將Word與Excel文檔轉(zhuǎn)化為Text,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-08-08一文詳解C#中重寫(override)及覆蓋(new)的區(qū)別
這篇文章主要為大家詳細介紹了C#中重寫(override)及覆蓋(new)這兩個關(guān)鍵詞的區(qū)別,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-03-03總結(jié)C#動態(tài)調(diào)用WCF接口的兩種方法
這篇文章給大家總結(jié)了C#動態(tài)調(diào)用WCF接口的兩種方法,大家可以根據(jù)自己的需求選擇對應的方式,下面來一起看看。2016-09-09探討C#中Dispose方法與Close方法的區(qū)別詳解
本篇文章是對C#中Dispose方法與Close方法的區(qū)別進行了詳細的分析介紹,需要的朋友參考下2013-06-06