2016-11-18 11 views
0

예외의 성능에 대한 논란이있는 의견이 있습니다.1000 작업을 취소하기위한 ThrowIfCancellationRequested() 대체?

그러나 취소 작업에는 ThrowIfCancellationRequested을 사용하는 것이 표준 방법 인 것으로 보입니다.

이제 1000 개의 작업을 한 번에 취소하려면 ThrowIfCancellationRequested이 적절한 방법입니까?

** 편집 **

좋아, 내가 달릴 테스트 및 ThrowIfCancellationRequested를 사용하는 성능 문제입니다. 1000 Tasks 자체는 TaskScheduler가 똑똑하기 때문에 문제가되지 않습니다.

ThrowIfCancellationRequested의 성능 단점이 없지만 여전히 예외 (몇 가지 코드 계층 구조 수준에도 불구하고 쉽게 처리)의 장점을 가진 우수한 대체품이 있는지 궁금합니다.

+0

시도하려면 테스트를 실행하고 싶을 수 있습니다. 1000 개의 작업이 많아 성능 문제가 발생할 수 있습니다. – Sefe

+0

자, 테스트를 실행했는데'ThrowIfCancellationRequested'를 사용하는 것이 성능 문제입니다. 1000 Tasks 자체는 TaskScheduler가 똑똑하기 때문에 문제가되지 않습니다. 'ThrowIfCancellationRequested'의 성능상의 단점이 없지만 여전히 예외 (여러 코드 계층 구조 수준에도 불구하고 쉽게 처리 할 수있는)의 장점을 가지고있는 우수한 대체품이 있는지 궁금합니다. – eikuh

답변

0

나는 던지기가 문제는 아니지만 1000 번 작업이라고 생각합니다. 스케줄러는 모든 태스크를 한 번에 실행할 수 없으므로 대부분의 태스크를 큐에 대기시켜야합니다. 모두가 하나의 CancellationToken을 공유하면 실행중인 모든 작업이 취소됩니다. 그런 다음 스케줄러는 즉시 취소 될 대기중인 태스크를 실행합니다. 스케쥴러가 작업을 취소하기 위해 모든 작업을 수행하게하므로 비효율적입니다.

작업을 실행할 때 CancellationToken을 전달 했습니까? 그렇게하고 싶다면 스케쥴러가 취소 사실을 압니다. 내가 권장할만한 것은 모든 작업을 한꺼번에 예약하지 않는 것입니다. 청크로 잘라내어 Task.ContinueWith을 사용하십시오. 여기서 작업이 실행되지 않도록 할 수 있습니다.

+0

아니요, 1000 가지 작업이 큰 문제는 아닙니다. 'if (IsCancellationRequested) return;을 사용하면 각 작업마다 0.15 ms (1000 개 작업의 경우 150 ms) 걸립니다. 그러나'ThrowIfCancellationRequested'를 사용하면 각 작업에 11ms가 걸립니다. (1000 작업 = 11000ms = 11 초) – eikuh

+0

'ContinueWith'를 사용하면'ThrowIfCancellationRequested '를 실행해야하기 때문에 여전히 문제가 발생하지 않습니다. '훨씬 덜 자주. – Sefe