성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 그냥 RSS Reader 기능과 약간의 UI 편의성 때문에 사용...
[이종효] 오래된 소프트웨어는 보안 위협이 되기도 합니다. 혹시 어떤 기능...
[정성태] @Keystroke IEEE의 문서를 소개해 주시다니... +_...
[손민수 (Keystroke)] 괜히 듀얼채널 구성할 때 한번에 같은 제품 사라고 하는 것이 아...
[정성태] 전각(Full-width)/반각(Half-width) 기능을 토...
[정성태] Vector에 대한 내용은 없습니다. Vector가 닷넷 BCL...
[orion] 글 읽고 찾아보니 디자인 타임에는 InitializeCompon...
[orion] 연휴 전에 재현 프로젝트 올리자 생각해 놓고 여의치 않아서 못 ...
[정성태] 아래의 글에 정리했으니 참고하세요. C# - Typed D...
[정성태] 간단한 재현 프로젝트라도 있을까요? 저런 식으로 설명만 해...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>C# - ThreadPool.SetMaxThreads 사용법</h1> <p> ThreadPool.SetMaxThreads는 CLR ThreadPool의 최대 생성 수를 제어할 수 있습니다.<br /> <br /> 그런데, 오랜만에 테스트하려고 사용했더니 동작을 안 합니다. ^^; 일례로 다음과 같이 간단하게 코딩을 했는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > internal class Program { static void Main(string[] args) { <span style='color: blue; font-weight: bold'>ThreadPool.SetMaxThreads(4, 4);</span> for (int i = 0; <span style='color: blue; font-weight: bold'>i < 10</span>; i ++) { int k = i; ThreadPool.QueueUserWorkItem((obj) => { Console.WriteLine($"{DateTime.Now.Second}: {k}"); <span style='color: blue; font-weight: bold'>Thread.Sleep(1000 * 60);</span> }); } Console.ReadLine(); } } </pre> <br /> 출력 결과가 이렇게 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 9: 9 9: 0 9: 5 9: 6 9: 8 9: 4 9: 7 9: 1 9: 2 9: 3 </pre> <br /> 원래는 4개까지 출력되고, 60초가 지나서야 하나씩 실행돼 10개가 나와야 하는데 그냥 9초 대에서 전부 출력이 된 것입니다. 혹시 뭔가 바뀐 것이 있나 검색했더니,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ThreadPool frustrations - Thread creation exceeding SetMaxThreads ; <a target='tab' href='https://stackoverflow.com/questions/11488966/threadpool-frustrations-thread-creation-exceeding-setmaxthreads'>https://stackoverflow.com/questions/11488966/threadpool-frustrations-thread-creation-exceeding-setmaxthreads</a> </pre> <br /> MSDN/docs 도움말을 인용하는군요. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ThreadPool.SetMaxThreads(Int32, Int32) Method ; <a target='tab' href='https://learn.microsoft.com/en-us/dotnet/api/system.threading.threadpool.setmaxthreads'>https://learn.microsoft.com/en-us/dotnet/api/system.threading.threadpool.setmaxthreads</a> </pre> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> You <span style='color: blue; font-weight: bold'>cannot set</span> the maximum number of worker threads or I/O completion threads to a number <span style='color: blue; font-weight: bold'>smaller than the number of processors on the computer</span>. </div><br /> <br /> <a target='tab' href='https://www.sysnet.pe.kr/2/0/12979#core24'>제 컴퓨터가 24개의 코어</a>니까, 기본적으로 "ThreadPool.SetMaxThreads(24, 24);" 호출부터 시작해야 하는 것입니다.<br /> <br /> 그런데, 저렇게 하면 "테스트 용도의" 코드가 좀 번거롭게 됩니다. 24개의 출력 결과를 항상 봐야 한다는 것인데요, 다행히 이에 대한 방법이 있습니다. ^^ 해당 문서에 이에 대해서도 나옵니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> In addition, you cannot set the maximum number of worker threads or I/O completion threads to a number smaller than the corresponding minimum number of worker threads or I/O completion threads. To determine the minimum thread pool size, call the GetMinThreads method.<br /> </div><br /> <br /> 그러니까 결국 GetMinThreads의 결과를 따라가는 것인데요, <br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ThreadPool.GetMinThreads(out int minWorkerThreads, out int minIoThreads); Console.WriteLine($"Worker: {minWorkerThreads}, IO: {minIoThreads}"); // 24개 코어를 가진 시스템에서, // 출력 결과: Worker: 24, IO: 24 </pre> <br /> 따라서, SetMinThreads 메서드를 이용해 이를 조절하면 됩니다. 이를 반영해 다시 코딩을 하고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > internal class Program { static void Main(string[] args) { <span style='color: blue; font-weight: bold'>ThreadPool.SetMinThreads(4, 4);</span> <span style='color: blue; font-weight: bold'>ThreadPool.SetMaxThreads(4, 4);</span> for (int i = 0; i < 10; i ++) { int k = i; ThreadPool.QueueUserWorkItem((obj) => { Console.WriteLine($"{DateTime.Now.Second}: {k}"); Thread.Sleep(1000 * 60); }); } Console.ReadLine(); } } </pre> <br /> 실행하면 이런 결과가 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 23: 0 23: 1 23: 2 ...[60초 후부터 출력]... </pre> <br /> 위의 경우 4개가 아닌, 3개의 출력으로 동시 실행을 보이는데요, ThreadPool은 닷넷 응용 프로그램 내부에서 전반적으로 사용되므로 1개는 다른 것에 의해 점유되었을 것입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 참고로, SetMinThreads를 사용해야 하는 경우가, 개인적으로는 예제 테스트 코드를 작성하는 경우 빼고는 없었습니다. 하지만, 종종 다음과 같은 상황에서 쓰면 좋을 때도 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > ThreadPool.QueueUserWorkItem의 실행 지연 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/1455'>https://www.sysnet.pe.kr/2/0/1455</a> WCF 프로그램에서 Task를 이용한 백그라운드 작업 시 클라이언트에 대한 병목현상. ; <a target='tab' href='https://www.sysnet.pe.kr/3/0/1310'>https://www.sysnet.pe.kr/3/0/1310</a> </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1508
(왼쪽의 숫자를 입력해야 합니다.)