Advertisement
MaksNew

Untitled

Jan 1st, 2023
1,181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.33 KB | None | 0 0
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Threading;
  4.  
  5. //Создать класс на языке C#, который:
  6. //- называется TaskQueue и реализует логику пула потоков;
  7. //- создает указанное количество потоков пула в конструкторе;
  8. //- содержит очередь задач в виде делегатов без параметров:
  9. //  delegate void TaskDelegate();
  10. //- обеспечивает постановку в очередь и последующее выполнение делегатов с помощью метода
  11. //  void EnqueueTask(TaskDelegate task);
  12.  
  13.  
  14.  
  15. namespace Мусор
  16. {
  17.     public delegate void TaskDelegate();
  18.  
  19.     public class TaskQueue
  20.     {
  21.         private readonly BlockingCollection<TaskDelegate> _blockingQueue
  22.             = new BlockingCollection<TaskDelegate>(new ConcurrentQueue<TaskDelegate>());
  23.  
  24.         public TaskQueue(int threadCount)
  25.         {
  26.             for (var i = 0; i < threadCount; i++)
  27.             {
  28.                 var thread = new Thread(DoThreadWork) {IsBackground = true};
  29.                 thread.Start();
  30.             }
  31.         }
  32.  
  33.         public void EnqueueTask(TaskDelegate task)
  34.         {
  35.             _blockingQueue.Add(task);
  36.         }
  37.  
  38.         private void DoThreadWork()
  39.         {
  40.             while (true)
  41.             {
  42.                 var task = _blockingQueue.Take();
  43.                 try
  44.                 {
  45.                     task();
  46.                 }
  47.                 catch (ThreadAbortException)
  48.                 {
  49.                     Thread.ResetAbort();
  50.                 }
  51.                 catch (Exception ex)
  52.                 {
  53.                     Console.WriteLine(ex.ToString());
  54.                 }
  55.             }
  56.         }
  57.     }
  58.  
  59.     static class Program
  60.     {
  61.         private static void TestTask()
  62.         {
  63.             Console.WriteLine("TestTask in thread #" + Thread.CurrentThread.ManagedThreadId);
  64.             Thread.Sleep(3000);
  65.         }
  66.  
  67.         static void Main(string[] args)
  68.         {
  69.             var taskQueue = new TaskQueue(3);
  70.             for (var i = 0; i < 10; i++)
  71.             {
  72.                 taskQueue.EnqueueTask(TestTask);
  73.             }          
  74.             Console.ReadLine();
  75.         }
  76.     }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement