2011-02-03 3 views
0

나는 여러 가지 방법으로 작업이 .Net에서 실행되는 시간을 제한한다는 것을 알고 있으며 이전에 사용했던 방법에 대해 놓친 또는 수정/개선 된 사항이 있는지 궁금해했습니다..Net에서 작업이 실행되는 시간을 제한하는 방법은 무엇입니까?

방법론이 얼마나 정확하게 작동하는지에 대해 명확하지 않은 곳에 질문을 포함 시켰습니다.

기존의 방법 나는 반드시 자신을 사용하지 않는하지만 알고 있어요 : 그 다음 일정 시간 동안 완료 스레드를 죽이는

  1. 는 설문 조사를 Thread을 만듭니다. 그것은 다소 불쾌한 그리고 내가 기억한다면 당신은 당신이 코드는 사용 등
  2. 사용 IAsyncResult 패턴을 unamanged 자원을 떠날 수, 즉 종료됩니다거야 보장이 없다 ThreadAbortException 년대에 의존으로이 솔루션은 크지 않다는 이 문제는 일정 시간 동안 기다릴 수 있지만 요청이 중단되도록 신호를 보낼 수있는 간단한 방법이 아니기 때문에 확인할 부울 플래그 (또는 비슷한)를 설정해야합니다. 비동기 코드 내부에서 멈추게합니다. 여기에서 문제는 비동기 코드가 코드의 특정 섹션에 걸린 경우 실제로 종료되기 전에 일정 시간 동안 계속 실행될 수 있다는 것입니다.
  3. 비동기 물건에 대해 사람들이 BackgroundWorker을 자주 보았지만 ASP.Net에서이 항목을 사용할 수 있습니까? (그렇다고 가정합니다) 특정 시간 후에 비동기 프로세스를 종료하는 간단한 방법이 있습니까?
  4. .Net 4.0에서 작업 API를 사용하십시오 (현재 모든 작업은 .Net 3.5에 제한되어 있으므로 나를위한 옵션이 아닙니다). MSDN 설명서를 빨리 ​​읽어 보면 CancellationToken을 사용하여 작업을 쉽게 취소 할 수있는 것처럼 보입니다. 그러나 취소가 얼마나 빨리 이루어지며 finally 블록이 호출되는지 확인할 수 있습니다.

모든 솔루션/제안/방법론은 4에서

답변

1

취소의 가장 안전한 형태는 항상 협조적입니다.

스레드를 죽이지 않는 것이 좋습니다 (ThreadAbortException 통해). 선택의 여지가 절대적으로 없으면 코드 을 대신 작성하십시오.이 코드는 정상적으로 종료 할 수 있습니다. AppDomains는 좋은 아이디어 였지만 실제 세계를 견디지 ​​못했습니다.

IAsyncResult, BackgroundWorkerCancellationToken은 모두 취소 가능한 형태입니다. 그래서 그들은 모두 매우 깨끗합니다 (리소스를 잃지 않고 finally 블록을 호출합니다 ...).하지만 "불량"코드를 처리 할 수 ​​없다는 단점이 있습니다.

백그라운드 작업 코드를 작성하는 경우 BackgroundWorker 또는 CancellationToken을 사용하십시오. "악의적 인"코드로 작업해야하는 경우 별도의 프로세스로 포장하십시오.

BackgroundWorker은 ASP.NET에서 정상적으로 작동하며 supports cooperative cancellation입니다.

1

취소 토큰을 환영하고 2에서 부울 플래그는 메커니즘의 같은 종류입니다. 두 경우 모두 태스크가 협조하고 플래그를 정기적으로 확인해야합니다. 4의 장점은 자신 만의 깃발을 만드는 대신 표준화 된 깃발을다는 것입니다.

중단 스레드는 악의적이지만 코드를 신중하게 작성하면 관리가 용이합니다. 특히 전역 상태가 손상되기 쉽습니다.

스레드를 중단하는 안전한 버전은 다른 app-domain에서 실행 중입니다. 그런 다음 스레드가 종료되면 app-domain을 언로드합니다. 모든 관리되지 않는 리소스에 올바른 중요한 종료 자/SafeHandles가있는 경우 안전한 방법으로 작동합니다.

관련 문제