Số lượng chủ đề tối đa bạn có thể tạo trong ứng dụng C # là bao nhiêu? Và điều gì xảy ra khi bạn đạt đến giới hạn này? Là một ngoại lệ của một số loại ném?
Số lượng chủ đề tối đa bạn có thể tạo trong ứng dụng C # là bao nhiêu? Và điều gì xảy ra khi bạn đạt đến giới hạn này? Là một ngoại lệ của một số loại ném?
Câu trả lời:
Không có giới hạn vốn có. Số lượng chủ đề tối đa được xác định bởi số lượng tài nguyên vật lý có sẵn. Xem bài viết này của Raymond Chen để biết chi tiết.
Nếu bạn cần hỏi số lượng chủ đề tối đa là bao nhiêu thì có lẽ bạn đang làm sai.
[ Cập nhật : Chỉ cần quan tâm: .NET Thread Pool số lượng mặc định của chuỗi:
(Những con số này có thể thay đổi tùy theo phần cứng và HĐH)]
Mitch nói đúng. Nó phụ thuộc vào tài nguyên (bộ nhớ).
Mặc dù bài viết của Raymond dành riêng cho các luồng của Windows, không dành cho các luồng C #, nhưng logic này cũng áp dụng tương tự (các luồng C # được ánh xạ tới các luồng của Windows).
Tuy nhiên, như chúng ta đang ở trong C #, nếu chúng ta muốn hoàn toàn chính xác, chúng ta cần phân biệt giữa các luồng "bắt đầu" và "không bắt đầu". Chỉ bắt đầu chủ đề thực sự dự trữ không gian ngăn xếp (như chúng ta có thể mong đợi). Các luồng không bắt đầu chỉ phân bổ thông tin theo yêu cầu của một đối tượng luồng (bạn có thể sử dụng phản xạ nếu quan tâm đến các thành viên thực tế).
Bạn thực sự có thể tự kiểm tra nó, so sánh:
static void DummyCall()
{
Thread.Sleep(1000000000);
}
static void Main(string[] args)
{
int count = 0;
var threadList = new List<Thread>();
try
{
while (true)
{
Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
newThread.Start();
threadList.Add(newThread);
count++;
}
}
catch (Exception ex)
{
}
}
với:
static void DummyCall()
{
Thread.Sleep(1000000000);
}
static void Main(string[] args)
{
int count = 0;
var threadList = new List<Thread>();
try
{
while (true)
{
Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
threadList.Add(newThread);
count++;
}
}
catch (Exception ex)
{
}
}
Đặt một điểm dừng trong ngoại lệ (tất nhiên là hết bộ nhớ) trong VS để xem giá trị của bộ đếm. Có một sự khác biệt rất đáng kể, tất nhiên.
Bạn nên sử dụng nhóm luồng (hoặc async delgates, lần lượt sử dụng nhóm luồng) để hệ thống có thể quyết định số lượng luồng sẽ chạy.
Jeff Richter trong CLR thông qua C #:
"Với phiên bản 2.0 của CLR, số lượng luồng công nhân tối đa mặc định là 25 trên mỗi CPU trong máy và số lượng luồng I / O tối đa mặc định là 1000. Giới hạn 1000 hoàn toàn không có giới hạn."
Lưu ý điều này dựa trên .NET 2.0. Điều này có thể đã thay đổi trong .NET 3.5.
[Chỉnh sửa] Như @Mitch đã chỉ ra, điều này là dành riêng cho CLR ThreadPool. Nếu bạn đang tạo chủ đề trực tiếp, hãy xem @Mitch và những người khác nhận xét.
Bạn có thể kiểm tra nó bằng cách sử dụng mã snipped này:
private static void Main(string[] args)
{
int threadCount = 0;
try
{
for (int i = 0; i < int.MaxValue; i ++)
{
new Thread(() => Thread.Sleep(Timeout.Infinite)).Start();
threadCount ++;
}
}
catch
{
Console.WriteLine(threadCount);
Console.ReadKey(true);
}
}
Cảnh giác với chế độ ứng dụng 32 bit và 64 bit.
Tôi khuyên bạn nên chạy phương thức ThreadPool.GetMaxThreads trong gỡ lỗi
ThreadPool.GetMaxThreads(out int workerThreadsCount, out int ioThreadsCount);
Tài liệu và ví dụ: https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.getmaxthreads?view=netframework-4.8