2013-07-30 2 views
4

백그라운드에서 많은 스레드를 실행하는 응용 프로그램을 코딩 중이므로 인터페이스의 테이블을 업데이트 할 수 있도록 기본 스레드로 다시보고해야합니다. 과거에는 작업자 스레드는 ProcessActions 기능이 모든 배경 작업을했던 주요 기능은 어디에 내가많은 스레드를 사용하고 통신하는 가장 효율적인 방법

new Thread(new ThreadStart(citizen.ProcessActions)).Start(); 

같은 것을 사용하여 메인 스레드에서 실행 한 보통 별도의 클래스 (라는 이름의 시민)이었다. 실제로 스레드를 시작하기 전에 Citizen 스레드가 인터페이스에 일부 내용을 기록 /보고 할 수 있도록 이벤트 처리기를 등록합니다. 대개 수십 개의 Citizen 스레드 (약 50 개)가 있으며 꽤 큰 클래스입니다. 각각은 자체 HTTP 클라이언트를 가지고 있으며 웹을 탐색합니다.

스레드 관리를위한 좋은 방법입니까? 아마도 솔직히 말하면 안됩니다. 스레드가 정상적으로 종료되지 않는다고 확신합니다. 일단 ProcessActions 함수가 완료되면 이벤트 핸들러를 제거하면됩니다. 메모리 사용량은 새로운 Citizen이 시작될 때마다 계속 증가합니다.

자주 (50+) 스레드를 관리하는 가장 좋은 방법은 무엇입니까? 저는 시민 변수에 대한 스레드 안전성에 대해 걱정할 필요가 없을 것이라고 생각합니다. 다른 스레드에서 액세스하지는 않지만 자체 스레드입니다.

+0

어떤 버전의 C#을 사용하고 있습니까? –

+0

스레드가 끝나면 죽여야합니다. 뭔가 살아 있어야합니다. – James

+0

C# 4.0을 사용하고 있습니다. 이벤트 처리기가 그 (것)들을 살아있을 수 있 었는가? 아마 내가 제대로 삭제하지 않을거야. – liliumdev

답변

2

당신이 찾고있는 것은 스레드 풀입니다. Here's an MSDN article on them이며 C# 4.0에서 사용할 수 있어야합니다.

아이디어는 스레드 풀을 생성하고, 그 개수를 높은 수 (예를 들어 50)로 설정 한 다음 스레드를 작업에 할당하는 것입니다. 풀을 확장해야한다면, 그렇게 할 수는 있지만 많은 수의 프론트를 선언하면 비싼 쓰레드 생성을 모두 막을 수 있습니다.

수행하려는 작업을 '대기'하고 스레드가 사용 가능 해지면 해당 작업을 할당하는 것이 좋습니다.

또한 메모리 누수를 찾기가 어려울 수 있지만 단순한 경우를 테스트하여 시작합니다. 모든 스레드를 꺼내고 (주 스레드에서 다른 Citizen을 실행 한 다음) 오랜 시간 실행하십시오. 메모리가 여전히 누수되는 경우 스레드 관리가 문제가되지 않습니다.

+0

대기열은 작업 우선 순위를 지정하는 데 유용합니다. – IAbstract

관련 문제