国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#使用隊列(Queue)解決簡單的并發問題

2020-01-24 01:35:44
字體:
來源:轉載
供稿:網友

本文通過實例,更具體的講解了隊列,隊列(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) 
 

 
//........ 
 

以上是本文的全部內容,希望對大家進一步學習隊列有所幫助

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 佛冈县| 东至县| 巴塘县| 山阳县| 广州市| 偃师市| 澄城县| 德州市| 高青县| 万年县| 三江| 精河县| 焉耆| 塘沽区| 于田县| 鄂尔多斯市| 丽水市| 咸宁市| 南华县| 青龙| 临沂市| 陆河县| 囊谦县| 潼关县| 普兰县| 平利县| 舟曲县| 白河县| 通许县| 晋州市| 岑巩县| 鄄城县| 高阳县| 晴隆县| 鄂托克旗| 体育| 黄平县| 郎溪县| 唐山市| 达尔| 平舆县|