[英]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.