亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2022年04月27日 14:23:28   作者:天空依然蔚藍(lán)  
這篇文章主要介紹了使用隊(duì)列(Queue)解決簡單的并發(fā)問題,講解的很細(xì)致,喜歡的朋友們可以了解一下

本文通過實(shí)例,更具體的講解了隊(duì)列,隊(duì)列(Queue)代表了一個先進(jìn)先出的對象集合。當(dāng)您需要對各項(xiàng)進(jìn)行先進(jìn)先出的訪問時,則使用隊(duì)列。當(dāng)您在列表中添加一項(xiàng),稱為入隊(duì),當(dāng)您從列表中移除一項(xiàng)時,稱為出隊(duì)。

有一個場景:一個搶購的項(xiàng)目,假設(shè)有5件商品,誰先搶到誰可以買,但是如果此時此刻(這里的此時此刻假設(shè)是相同的時間),有100人去搶這個商品,如果使用平時的方法會出現(xiàn)什么情況呢?你懂的,這里所說是就是有關(guān)并發(fā)的問題。

平時我們?nèi)コ匈徫锶ソY(jié)賬的時候就是排隊(duì),這里我們先讓搶購人排好隊(duì),按時間,誰先點(diǎn)擊的搶購按鈕誰就排在前面,這樣就形成了一個隊(duì)列,然后我們再對這個隊(duì)列處理,這樣就不會出現(xiàn)并發(fā)的問題了。(至少可以處理這樣簡單的并發(fā),這里不討論太復(fù)雜的并發(fā))

案例:

要求:有一個發(fā)布文章的接口,每發(fā)布一篇文章,調(diào)用一下接口。(這里不用批量發(fā)布,為了講解這個)

建立一個這樣的處理程序類,BusinessInfoHelper.cs

namespace MyNameSpace  
 
{ 
  //隊(duì)列臨時類 
  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)者消費(fèi)者模式進(jì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 
        { 
          //沒有任務(wù),休息3秒鐘 
          Thread.Sleep(3000); 
        } 
      } 
    } 
 
    //要執(zhí)行的方法 
    private void ScanQueue() 
    { 
      while (ListQueue.Count > 0) 
      { 
        try 
        { 
          //從隊(duì)列中取出 
          QueueInfo queueinfo = ListQueue.Dequeue(); 
 
          //取出的queueinfo就可以用了,里面有你要的東西 
          //以下就是處理程序了 
          //。。。。。。 
 
        } 
        catch (Exception ex) 
        { 
          throw; 
        } 
      } 
    } 
 
 
    #endregion 
  } 
} 
 

以上頁面寫好后,在程序開始運(yùn)行時就得啟動這個線程去不停的處理任務(wù),那么我們在Global的Application_Start里可以這樣寫:

//啟動發(fā)布優(yōu)質(zhì)媒體程序?
MyNameSpace.BusinessInfoHelper.Instance.Start();?

有一個問題出來了,如果我處理完隊(duì)列中的一條記錄后,想返回這條記錄的ID,這個程序好像不能完成,我就使用了另一個方法 Lock方法 ,把方法鎖定,具體的如下,

在頁面中定義全局的鎖:

private static object lockObject= new Object();?

在方法中這樣調(diào)用:

lock(lockObject)?
?
{?
?
//........?
?
}?

以上是本文的全部內(nèi)容,希望對大家進(jìn)一步學(xué)習(xí)隊(duì)列有所幫助

相關(guān)文章

最新評論