2011-08-12 5 views
2

나는 그 센서를 질의하는데 사용하는 하드웨어 센서를위한 폐쇄 형 소스 API를 가지고있다. API는 C# interop을 통해 사용하는 DLL로 제공됩니다. API 함수가 차단 중입니다. 대개 오류 값을 반환하지만 어떤 경우에는 오류 값을 반환하지 않습니다.함수 호출을 막기위한 watch dog

이 상황을 감지하고이 경우 차단 된 스레드를 제거 할 수 있어야합니다. 어떻게 C#에서이 작업을 수행 할 수 있습니까?

호출되는 스레드는 BackgroundWorker를 통해 만들어집니다. 내가 함수를 호출하기 전에 설정할 수있는 함수 호출을 차단하기위한 간단한 감시견을 찾고 있는데 내가 돌아 왔을 때 다시 설정합니다. 그냥 앉아서 돌아올 때까지 기다려야합니다. 그렇지 않으면 스레드가 죽을 것입니다. 1) API가 다시 해제되고 응용 프로그램의 스레드가 여전히 응답하지 않고 인 경우을 반환해야합니다. 2) 다른 복구 조치를 취할 수 있습니다. API를 다시 초기화하여 계속 작업 할 수 있습니다.

답변

6

API 호출 전에 특정 제한 시간이 지나면 System.Threading.Timer를 설정 한 다음 호출 완료 후 Timer를 처리하는 것이 한 가지 방법 일 수 있습니다. Timer가 실행되면 ThreadPool 스레드에서 실행되고 적절한 동작을 수행하여 문제가되는 스레드를 종료 할 수 있습니다.

비 관리 코드로 차단 된 경우 .NET의 Thread.Abort()가 작동하지 않으므로 Win32 TerminateThread API에 P/Invoke해야합니다.

는 또한 프로세스가 강제로 공유 메모리 상태를 돌연변이의 중간에되었을 수 있습니다, 동기화 개체를 잡고, 또는 될 수있는 종료 스레드로, 스레드를 살해 한 후 안전한 상태가됩니다 매우 확률이 낮다 있습니다 다른 중요한 작업. 종료로 인해 다른 스레드가 멈추거나 프로세스가 중단되거나 데이터가 손상되거나 개와 고양이가 함께 살 수 있습니다. 무슨 일이 일어날 지 확신 할 수있는 방법이 없지만 기회가 나빠질 것입니다. 가능한 한 가장 안전한 방법은 API의 사용을 원격 채널을 통해 통신하는 별도의 프로세스로 분리하는 것입니다. 그런 다음 프로세스를 죽이는 것이 스레드를 죽이는 것보다 훨씬 안전하기 때문에 필요할 때 외부 프로세스를 종료 할 수 있습니다.

+0

좋은 답변입니다. 함께 사는 고양이와 개 외에, 당신이 실을 죽일 때 기억이 누출 될 것입니다. 나는 죽을 수있는 별도의 과정을 가지고 있다는 당신의 제안을 좋아합니다. 그런 식으로 정리하는 것이 더 자동적입니다. –

+0

+1 : 동의합니다. 별도의 프로세스가 가장 좋은 방법입니다. 그것은 끔찍하지만 인생은 때로는 그렇습니다. –

+0

별도의 프로세스 아이디어가 실제로 좋습니다. 또한 관리되지 않는 DLL의 32 비트 버전 만 있기 때문에 x86 용 전체 관리 응용 프로그램을 구축하지 않아도됩니다. (다른 아이디어가 여전히 나오는지 여부를 단지 확인하는 것입니다.) – ygoe

관련 문제