簡體   English   中英

帶有計時器C#的靜態FIFO隊列

[英]Static FIFO queue with timer c#

我有一個.NET 4.0 ASP.NET項目,該項目需要一些我以前從未真正搞過的線程工作,而且我已經看了好幾天了,但我仍然一無所知= /

基本上,我想要的東西是當您在熟食店買票並等待轉機,然后他們才回到您的身邊。 我將嘗試將其關聯起來,看看是否有意義...

函數開始--->到達需要“獲取票證”的部分(我假設將某個類型的項目排隊在blockingcollection中),然后等待,直到其他“票證”(又稱同一功能的其他實例)完成為止使函數可以繼續執行(阻止收集到隊列中的項目)--->完成函數。

我不需要/不想在隊列中做任何工作,我只希望函數靜態地等待該函數在其他函數實例之間輪換。 那有意義嗎? 那可能嗎?

請提供代碼(如果可能的話),因為我已經看過很多示例,但是它們都沒有道理/不符合我的要求。

如果您想使用計時器解決方案,則可以將所有操作排隊到BlockingCollection中,並使用專用線程將它們出隊。 該線程將等待5秒,然后將出隊的項目推送到線程池中。 該專用線程應在無限循環中執行此操作。 出隊,等待,推動。

但是,我實際上建議您使用SemaphoreSlim類來限制對此易碎的Web服務的並發請求數。 可能您應該選擇一個介於1到5之間的數字作為允許的並發量。

好吧,在研究了一個文檔又一個文檔並玩了無數次代碼重寫之后,我終於發現我沒有使用AutoResetEvent權限,而是如何在專用線程上使用阻塞集合。 因此,這是將AutoResetEvent與BlockingCollection一起使用的最終解決方案。 下面的解決方案可能不會在100%的時間內顯示出相同的結果(只是因為我認為這與向阻止集合中輸入內容的線程計時有關),但最終結果是它確實滿足了我的要求。

class Program
{
    static void Main(string[] args)
    {
        TaskProcessor tp = new TaskProcessor();

        Thread t1 = new Thread(new ParameterizedThreadStart(tp.SubmitRequest));
        t1.Start(1);

        Thread t2 = new Thread(new ParameterizedThreadStart(tp.SubmitRequest));
        t2.Start(2);

        Thread t3 = new Thread(new ParameterizedThreadStart(tp.SubmitRequest));
        t3.Start(3);         
    }
}

class TaskProcessor
{
    private AutoResetEvent _Ticket;

    public TaskProcessor()
    {
        _Continue = new AutoResetEvent(false);
    }

    public void SubmitRequest(object i)
    {
        TicketingQueue dt = new TicketingQueue();

        Console.WriteLine("Grab ticket for customer {0}", (int)i);

        dt.GrabTicket(_Ticket);

        _Continue.WaitOne();

        Console.WriteLine("Customer {0}'s turn", (int)i);
    }
}

public class TicketingQueue
{
    private static BlockingCollection<AutoResetEvent> tickets = new BlockingCollection<AutoResetEvent>();

    static TicketingQueue()
    {
        var thread = new Thread(
          () =>
          {
              while (true)
              {                      
                  AutoResetEvent e = tickets.Take();
                  e.Set();
                  Thread.Sleep(1000);
              }
          });
        thread.Start();
    }

    public void GrabTicket(AutoResetEvent e)
    {
        tickets.Add(e);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM