2

현재 .NET C# 4.0에서 작업 중이며 일부 두통을 유발하는 일부 코드 문제가 발생했습니다.System.Threading.ThreadAbortException이 새 스레드에서 발생했습니다.

System.Threading.Tasks.TaskFactory 클래스를 System.Threading.Tasks.TaskScheduler와 함께 사용하여 콘솔 응용 프로그램에서 새 스레드를 시작합니다. 여기서 스레드의 기능은 항목이 추가되었는지 확인하는 것입니다. 대기열로. 항목이 대기열에 추가되면 처리됩니다.

그래서 큐에는 보낼 전자 메일이 포함되어 있으며 전자 메일이 큐에 추가되면 전자 메일은 여러 클라이언트를 통해 전송됩니다. 각각에 보내는 것은 병렬로 수행됩니다. 코드 최적화 또는 때문에

가 는 [System.Threading.ThreadAbortException] = {표현식을 평가할 수없는 네이티브 프레임이

:

는 I는 다음과 같은 예외가 새로운 스레드의 시간의 몇몇 발생이 간헐적 문제가 }

디버깅 할 때 스택의 모든 속성에 "코드가 최적화되었거나 기본 프레임이 호출의 최상위에 있기 때문에 표현식을 평가할 수 없습니다."라는 추가 정보를 얻을 수 없습니다. 스택."

인터넷에서 해결책을 찾고 있는데,이 문제는 response.redirect를 할 때 발생하지만 내 코드에서는이를 수행하지 않는 것으로 나타났습니다. 디버깅을 시도하면이 오류가 발생한 위치와 일관성이 없습니다.

this.taskFactory = new TaskFactory(TaskScheduler.Current); 
    this.taskFactory.StartNew(this.DequeueMessage, state, TaskCreationOptions.LongRunning); 

이 사람이 어떻게 내가이 오류와에 관한 어떤 조언을 받고있을 수 있습니다 이유에 어떤 포인터

을 고정 할 수 있습니다 : 코드는 내가 공장을 만드는 데 사용할 새 스레드를 시작한다 다음은?

+1

웹 앱에서 할 일 목록을 만들고 있습니까? 그렇다면 아마도 AppDomain이 재활용되고있는 것을 볼 수 있습니다. 해결 방법은 백그라운드 스레드를 Windows 서비스로 이동하는 것입니다. –

+0

Visual Studio에서 실행중인 간단한 통합 테스트에서이 동작이 나타납니다. 또한 콘솔 응용 프로그램에서 동일한 코드를 실행할 때 동일한 동작을 참조하십시오. – amateur

답변

3

ThreadAbortException을 얻는 유일한 이유는 스레드에서 Thread.Abort이 호출 되었기 때문입니다. 수동으로하지 않으면 클라이언트 응용 프로그램이 종료 될 때이 오류가 발생할 수 있습니다. 또한 환경이 재활용 될 때 호스팅 환경에서도 발생합니다. 세부 정보를 제공하면보다 구체적인 답변을 제공 할 수 있습니다.

+2

micrsoft visual studio testing framework의 도움으로 작성된 통합 테스트를 통해이 코드를 호출합니다. 테스트를 실행할 때 코드가 완전히 실행되기 전에 완료되므로 Thread.Abort가 완성되었습니다. 이것이 가능할 수 있습니까? – amateur

+2

@amateur 예, 그게 정확히 일어난 일입니다. 테스트 프로세스는 백그라운드 스레드가 완료되기 전에 존재합니다. 테스트를 끝내기 전에 백그라운드 스레드가 완료 될 때까지 "대기"해야합니다. Task.Wait() (StartNew는 Task 객체를 반환합니다)로이 작업을 수행 할 수 있습니다. –

+0

Ah- 나를 생각하게하는 것은 당신의 반응이었습니다! 반환 된 작업 개체에 대한 Wait 메서드를 호출하면 작업이 아무것도 처리하지 않고 아무 작업도 수행하지 않는 상태로 이동하는 것처럼 보입니다. 왜 이것이 사실 일지 모른다고 생각하세요? – amateur