Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Concurrent;
- using System.Collections.Generic;
- using System.Threading;
- using System.Threading.Tasks;
- namespace ConsoleApplication3
- {
- class Program
- {
- private static List<int> calls = new List<int>();
- private static ConcurrentDictionary<int, ConcurrentQueue<Task>> Requests = new ConcurrentDictionary<int, ConcurrentQueue<Task>>();
- private static int queueTasks;
- static void Main(string[] args)
- {
- Task.Run(() => { Enqueue(new Task(() => { calls.Add(1); Thread.Sleep(1); }), 1); });
- Task.Run(() => { Enqueue(new Task(() => { calls.Add(2); Thread.Sleep(1); }), 1); });
- Task.Run(() => { Enqueue(new Task(() => { calls.Add(3); Thread.Sleep(1); }), 1); });
- Task.Run(() => { Enqueue(new Task(() => { calls.Add(4); Thread.Sleep(1); }), 1); });
- Thread.Sleep(500);
- foreach (var call in calls)
- {
- Console.WriteLine($"call: {call}");
- }
- Console.WriteLine($"queue tasks running: {queueTasks}");
- }
- private static void Enqueue(Task task, int siteId)
- {
- ConcurrentQueue<Task> queue;
- if (!Requests.ContainsKey(siteId))
- {
- Requests.GetOrAdd(siteId, new ConcurrentQueue<Task>());
- }
- Requests.TryGetValue(siteId, out queue);
- var isRunning = queue?.Count > 0;
- queue?.Enqueue(task);
- if (!isRunning)
- {
- Task.Run(() => CheckQueue(siteId));
- queueTasks++;
- }
- }
- private static void CheckQueue(int siteId)
- {
- ConcurrentQueue<Task> queue;
- Requests.TryGetValue(siteId, out queue);
- if (queue == null) return;
- while (queue.Count > 0)
- {
- Task task;
- queue.TryPeek(out task);
- if (task != null)
- {
- task.Start();
- task.Wait();
- queue.TryDequeue(out task);
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement