집 >백엔드 개발 >C#.Net 튜토리얼 >C# 멀티스레딩 - 스레드 풀에 대한 자세한 소개
라인 System.Threading.ThreadPool - 작업 항목 전송, 비동기 I/O 처리, 다른 스레드 대신 대기 및 타이머 처리에 사용할 수 있습니다. 기본 사용법:
public void Main() { ThreadPool.QueueUserWorkItem(JobForAThread); // 将某工作交给线程池}void JobForAThread(object state) // 线程要执行的工作:满足 委托WaitCallback {for (int i = 1; i
ThreadPool.QueueUserWorkItem() 메서드를 실행한 후 프로세서는 자동으로 풀에서 "작업 콘텐츠"를 처리할 스레드를 선택합니다.
1. 스레드 풀이 아직 실행되지 않은 경우 스레드 풀이 생성되고 첫 번째 스레드가 시작됩니다.
2. 스레드 풀이 이미 실행 중이고 유휴 스레드가 하나 이상 있는 경우 스레드 풀은 처리를 위해 "작업 콘텐츠"를 이 유휴 스레드에 넘겨줍니다.
3. 해당 시점 스레드 풀에 유휴 스레드가 없으면 해당 작업은 이를 처리할 유휴 스레드가 있을 때까지 대기 상태에 있게 됩니다.
ThreadPool.GetMaxThreads() 메서드를 통해 동시에 활성화될 수 있는 스레드 풀 요청 수를 검색합니다.
int vWorkerThreads; int vCompletionPortThreads; ThreadPool.GetMaxThreads(out vWorkerThreads, out vCompletionPortThreads); Console.WriteLine("池中辅助线程的最大数{0},池中异步 I/O 线程的最大数{1}", vWorkerThreads, vCompletionPortThreads);
ThreadPool.SetMaxThreads() 메서드를 통해 동시에 활성화할 수 있는 스레드 풀 요청 수를 설정할 수 있습니다.
ThreadPool.SetMaxThreads(5, 4);
그러나 보조 스레드 수나 비동기 I/O 완료 스레드 수를 컴퓨터 프로세서 수보다 작게 설정할 수는 없습니다. 스레드 풀은 사용이 매우 간단하지만 몇 가지 제한 사항이 있습니다.
1. 스레드 풀의 모든 스레드는 백그라운드 스레드입니다. 프로세스의 모든 포그라운드 스레드가 종료되면 모든 백그라운드 스레드가 중지됩니다. 풀에 들어가는 스레드는 포그라운드 스레드로 변경될 수 없습니다.2. 풀에 들어가는 스레드의 우선순위나 이름을 설정할 수 없습니다.
3. 풀의 스레드는 단기 작업에만 사용할 수 있습니다. 스레드가 항상 실행되기를 원한다면 Thread 클래스를 사용하여 스레드를 생성해야 합니다.
JobForAThread() 작업 작업 개체 상태에 매개변수 전달, 호출: public void Main()
{
ThreadPool.QueueUserWorkItem(JobForAThread,"这是传递给工作内容的参数"); // 添加工作的同时,传递参数Console.ReadKey(); // 让主线程等待,否则“一闪而过” }void JobForAThread(object state)
{
Console.WriteLine("收到信息:{0}", (string)state); // 处理传进来的数据for (int i = 1; i
一
일반적인 상황에서는 "작업"이 스레드 풀로 넘겨지면 제어할 수 없게 됩니다. 실행을 시작할 시기는 프로세서에 의해 자동으로 결정됩니다(물론 유휴 스레드가 있는 경우에만). 다음 코드를 사용하여 작업을 지정된 시간 이후에 실행을 시작하도록 할 수 있습니다. ManualResetEvent mManualEvent;public void Main()
{
mManualEvent = new ManualResetEvent(false); // 实例ThreadPool.QueueUserWorkItem(JobForAThread);
Console.WriteLine("{0} 任务已经交给线程池了,但是它没有执行.", DateTime.Now.ToString("HH:mm:ss"));
Thread.Sleep(10000); // 等待 10smManualEvent.Set(); // 发出信号,让线程继续执行
Console.ReadKey(); // 让主线程等待,否则“一闪而过” }void JobForAThread(object state)
{
mManualEvent.WaitOne(); // 等待 “ mManualEvent.Set();” 这一句执行(发送信号)Console.WriteLine("{0} 现在开始执行任务啦.", DateTime.Now.ToString("HH:mm:ss"));for (int i = 1; i
여기서 작업이 스레드 풀로 넘겨진 후 스레드가 작업을 실행할 때 메인 스레드가 신호를 보낼 때까지 mManualEvent.WaitOne()에서 차단됩니다. 10초 후에 작업은 계속해서 후속 코드를 실행합니다. 이는 제어 작업으로, 기본적으로 지정된 작업이 예상대로 작동을 시작하는 것을 허용하지 않습니다. 여기서 ManualResetEvent 객체를 초기화할 때 false 매개변수는 신호가 기본적으로 "차단 상태"로 설정된다는 의미이며,
mManualEvent.Set(); 코드를 통해 신호가 "계속 가능한 상태"로 설정됩니다. 반대로 mManualEvent.Reset(); 코드를 통해 스레드를 "차단된 상태"로 전환할 수 있습니다.
이 있는 경우 다른 코드를 계속 실행하기 전에 스레드 풀의 모든 스레드가 실행을 완료할 때까지 기다려야 합니다. AutoResetEvent[] mAutoResetEvent;public void Main()
{
mAutoResetEvent = new AutoResetEvent[]{new AutoResetEvent(false), // 默认信号为 阻塞new AutoResetEvent(false),new AutoResetEvent(false)
};for (int i = 0; i
위 내용은 C# 멀티스레딩 - 스레드 풀에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!