C# 멀티스레딩 - 스레드 풀에 대한 자세한 소개

零下一度
풀어 주다: 2017-06-24 09:38:15
원래의
2693명이 탐색했습니다.

라인 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초 후에 작업은 계속해서 후속 코드를 실행합니다. 이는 C# 멀티스레딩 - 스레드 풀에 대한 자세한 소개 제어 작업으로, 기본적으로 지정된 작업이 예상대로 작동을 시작하는 것을 허용하지 않습니다. 여기서 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# 멀티스레딩 - 스레드 풀에 대한 자세한 소개</p>[]<p></p><p>

위 내용은 C# 멀티스레딩 - 스레드 풀에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿