새로운 구문 중 하나 대신 일반 오래된 Thread 객체를 사용하는 것이 더 좋은 경우가 있습니까?
블로그 게시물과 많은 사람들이 Thread
최근 C # 버전의 클래스 사용을 피하거나 조언하지 않습니다 (그리고 4.0을 더하고 Task
친구를 추가 함 ). 이전에도 평범한 오래된 스레드의 기능을 ThreadPool
클래스 로 대체 할 수 있다는 사실에 대한 논쟁이있었습니다 .
또한 다른 특수 메커니즘으로 인해 추악한 + 콤보를 교체하는 Thread
것과 같은 GUI Timer
의 매력을 떨어 뜨릴 수 있습니다 .Thread
Sleep
BackgroundWorker
그럼에도 불구하고 Thread
일부 사람들 (나 자신을 포함하여)에게 매우 친숙한 개념으로 남아있는 사람들은 일종의 병렬 실행과 관련된 작업에 직면했을 때 좋은 구식 Thread
클래스 를 직접 사용합니다 . 요즘 내 길을 수정할 때가되는지 궁금합니다.
그래서 제 질문은 Thread
위의 구문 중 하나 대신 일반 오래된 객체 를 사용하는 것이 필요하거나 유용한 경우가 있습니까?
Thread 클래스는 언급 한 다른 모든 패턴 의 구현 세부 사항 이므로 분명히 쓸모가 없습니다 .
그러나 그것은 실제로 당신의 질문이 아닙니다. 당신의 질문은
위의 구문 중 하나 대신 일반 낡은 Thread 객체를 사용하는 것이 필요하거나 유용한 경우가 있습니까?
확실한. 정확하게 상위 레벨 구조 중 하나가 귀하의 요구를 충족시키지 못하는 경우.
내 조언은 기존의 고 흡수 도구가 요구 사항을 충족하지 못하는 상황에 처해 있고 스레드를 사용하여 솔루션을 구현하려는 경우 실제로 필요한 누락 된 추상화를 식별 한 다음 해당 추상화 를 구현해야한다는 것입니다 스레드 를 사용한 다음 추상화 를 사용하십시오 .
스레드는 특정 사물 (예 : 병렬 처리 및 비동기)의 기본 구성 요소이므로 제거해서는 안됩니다. 그러나 , 대한 대부분의 사람과 가장 (한 번에 2,000 스레드를 산란하여 시스템 과부하없이 동시에 여러 작은 작업을 처리하는 좋은 방법을 제공) 등 스레드 풀과 같은 당신이 언급 사용하는 것이 더 적절한 일이, 거기에 사용 사례, BackgroundWorker
( 단 하나의 단기 작업에 대한 유용한 이벤트를 캡슐화합니다).
그러나 많은 경우에, 프로그래머가 불필요하게 바퀴를 재발견하거나 바보 같은 실수를하는 것을 막는 것이 더 적합하기 때문에 Thread 클래스가 쓸모가 없다는 것을 의미하지는 않습니다. 위에서 언급 한 추상화에 의해 여전히 사용되며보다 특수한 클래스에 포함되지 않은 스레드에 대한 세밀한 제어가 필요한 경우 여전히 필요합니다.
비슷한 맥락 에서 사람들이 배열을 사용하는 많은 경우에 더 적합 .NET
함에도 불구하고 배열 사용을 금지하지 않습니다 List<T>
. 표준 라이브러리에서 다루지 않는 것들을 계속 만들고 싶을 수도 있기 때문에.
Task
그리고 Thread
다른 추상화입니다. 스레드를 모델링하려는 경우 Thread
클래스가 여전히 가장 적합한 선택입니다. 예를 들어 현재 스레드와 상호 작용 해야하는 경우 더 나은 유형을 볼 수 없습니다.
그러나 .NET은 Thread
많은 경우에 선호되는 몇 가지 전용 추상화를 추가했습니다 .
이 Thread
클래스는 더 이상 사용되지 않으며 특별한 상황에서 여전히 유용합니다.
내가 일하는 곳에서는 콘텐츠 관리 시스템의 일부로 '백그라운드 프로세서'를 작성했습니다. 디렉토리, 전자 메일 주소 및 RSS 피드를 모니터링하는 Windows 서비스 및 새로운 것으로 나타날 때마다 작업을 실행할 때마다 일반적으로 데이터.
이를 위해 스레드 풀을 사용하려는 시도는 작동하지 않았습니다. 동시에 너무 많은 작업을 실행하고 디스크를 휴지통에 넣으려고 시도하므로 Thread
클래스 를 직접 사용하여 자체 폴링 및 실행 시스템을 구현했습니다 .
새로운 옵션을 사용하면 (고가의) 스레드를 직접 사용하고 관리하는 빈도가 줄어 듭니다.
어떤 종류의 병렬 실행과 관련된 작업에 직면했을 때 좋은 오래된 Thread 클래스를 사용하는 것으로 직접 이동합니다.
병렬 작업을 수행하는 매우 비싸고 비교적 복잡한 방법입니다.
비용이 가장 중요하다는 점에 유의하십시오. 전체 작업 스레드를 사용하여 소규모 작업을 수행 할 수 없으면 비생산적입니다. ThreadPool은 비용, 작업 클래스의 복잡성 (예외, 대기 및 취소)에 대처합니다.
" 일반적인 오래된 Thread 객체를 사용하는 것이 필요하거나 유용한 경우가 있습니까? "라는 질문에 대답 하기 위해, 오래 지속되는 프로세스가있을 때 평범한 오래된 Thread는 유용하지만 (필요하지는 않음) 다른 스레드와 상호 작용하지 마십시오.
예를 들어, 일종의 메시지 대기열에서 메시지를 수신하도록 구독하는 응용 프로그램을 작성하고 응용 프로그램이 해당 메시지를 처리하는 것 이상을 수행하려는 경우 스레드가 사용되므로 스레드를 사용하는 것이 유용합니다. 자 급식 (즉, 당신이 그것을 끝내기를 기다리지 않고), 그것은 오래 가지 않습니다. ThreadPool 클래스를 사용하면 수명이 짧은 여러 작업 항목을 대기열에 추가하고 새 Thread를 사용할 수있을 때 ThreadPool 클래스를 효율적으로 처리 할 수 있습니다. 스레드를 직접 사용하는 곳에서 작업을 사용할 수 있지만 위 시나리오에서는 많이 사지 않을 것이라고 생각합니다. 스레드와의 상호 작용을보다 쉽게 도와줍니다 (위의 시나리오에서는
아마 당신이 기대했던 대답은 아니지만 .NET Micro Framework에 대해 코딩 할 때 항상 Thread를 사용합니다. MF는 상당히 줄었고 더 높은 수준의 추상화를 포함하지 않으며 Thread 클래스는 낮은 MHz CPU에서 마지막 성능 비트를 가져와야 할 때 매우 유연합니다.
Thread 클래스를 ADO.NET과 비교할 수 있습니다. 작업을 수행하는 데 권장되는 도구는 아니지만 더 이상 사용되지 않습니다. 작업을 용이하게하기 위해 다른 도구가 그 위에 구축됩니다.
Thread 클래스를 다른 것보다 사용하는 것은 잘못된 일이 아니며, 특히 필요한 기능을 제공하지 않는 경우에는 더 그렇습니다.
확실히 쓸모없는 것은 아닙니다.
The problem with multithreaded apps is that they are very hard to get right (often indeterministic behavior, input, output and also internal state is important), so a programmer should push as much work as possible to framework/tools. Abstract it away. But, the mortal enemy of abstraction is performance.
So my question is, are there any cases when it's necessary or useful to use a plain old Thread object instead of one of the above constructs?
I'd go with Threads and locks only if there will be serious performance problems, high performance goals.
I've always used the Thread class when I need to keep count and control over the threads I've spun up. I realize I could use the threadpool to hold all of my outstanding work, but I've never found a good way to keep track of how much work is currently being done or what the status is.
Instead, I create a collection and place the threads in them after I spin them up - the very last thing a thread does is remove itself from the collection. That way, I can always tell how many threads are running, and I can use the collection to ask each what it's doing. If there's a case when I need to kill them all, normally you'd have to set some kind of "Abort" flag in your application, wait for every thread to notice that on its own and self-terminate - in my case, I can walk the collection and issue a Thread.Abort to each one in turn.
In that case, I haven't found a better way that working directly with the Thread class. As Eric Lippert mentioned, the others are just higher-level abstractions, and it's appropriate to work with the lower-level classes when the available high-level implementations don't meet your need. Just as you sometimes need to do Win32 API calls when .NET doesn't address your exact needs, there will always be cases where the Thread class is the best choice despite recent "advancements."
'IT박스' 카테고리의 다른 글
날짜 문자열을 날짜로 구문 분석하는 방법은 무엇입니까? (0) | 2020.07.27 |
---|---|
모든 것을 한 눈에 보는 방법? (0) | 2020.07.27 |
PHP에서 cURL을 사용한 RAW POST (0) | 2020.07.27 |
Android 용 Eclipse에서 ProGuard 활성화 (0) | 2020.07.27 |
매개 변수를 통한 캐시 버스 팅 (0) | 2020.07.27 |