Untitled
unknown
csharp
2 years ago
2.1 kB
101
Indexable
namespace ConsoleApp1 { class Program { static void Main(string[] args) { var workerCount = 10; var jobCount = 100; var workers = new List<Thread>(); // Phân lô bán nền, tạo x job cho x thread đầu for (int i = 1; i <= workerCount; i++) { workers.Add(new Thread(DoWork)); workers[i - 1].Name = i.ToString(); workers[i - 1].Start(new MyClassForThread { ThreadIdx = i, WorkIdx = i }); // Thực thi & truyền params } // phân lô các job còn lại for (int i = workerCount + 1; i <= jobCount; i++) { // tìm thread free, nếu không thấy thì chờ đến khi có thread free var freeWorker = workers.FirstOrDefault(t => !t.IsAlive); while (freeWorker == null) { freeWorker = workers.FirstOrDefault(t => !t.IsAlive); Thread.Sleep(100); // Tạm nghỉ để chờ worker hoàn thành job } // Không có khái niệm restart thread trong c#, xử lý bằng cách tạo mới thread ở vị trí của thread vừa hoàn thành var idx = workers.IndexOf(freeWorker); workers[idx] = new Thread(DoWork); workers[idx].Start(new MyClassForThread { ThreadIdx = idx+1, WorkIdx = i }); } Console.WriteLine("\n==== DONE ===="); Console.ReadKey(); } public static void DoWork(object param) { var i = (MyClassForThread) param; var time = new Random().Next(1000, 10000); Console.WriteLine($"[START] Thread {i.ThreadIdx}, job {i.WorkIdx}"); Thread.Sleep(time); Console.WriteLine($"[END] Thread {i.ThreadIdx}, job {i.WorkIdx} - {time}ms"); } } class MyClassForThread { public int ThreadIdx { get; set; } public int WorkIdx { get; set; } } }
Editor is loading...