문제

제3자를 호출하려면 API를 사용해야 하며, 이상적으로는 API가 반환하는 응답을 사용해야 합니다.API에는 30초 제한 시간이 내장되어 있으며 이를 프로그래밍 방식으로 설정할 수 없습니다.12초 안에 타임아웃이 되어야 합니다.제가 거는 전화는 다음과 같습니다.

문자열 응답 = theAPI.FunctionA(a, b, c, d);

나는 이 작업을 수행하고 12초에 스레드를 중단하기 위해 비동기 호출을 사용해야 할 수도 있다고 생각했습니다.또 다른 stackoverflow 질문은 내가 고려하고 있는 것과 비슷한 것으로 보입니다. C# 일반 시간 초과 구현

...이것이 최선의 방법인지 궁금합니다.특히, 무슨 일이 있어도 EndInvoke를 호출하라고 경고하는 기사가 계속 표시되고, 참조된 예제에서와 같이 Abort가 스레드를 적절하게 닫을지 궁금합니다.Abort 사용에 대해 많은 우려를 표하는 의견이 있었습니다.

도움이 되었습니까?

해결책

실을 중단하는 것은 일반적으로 나쁜 생각입니다. 통화가 완료되거나 30 초 후에 시간을 초과하는 것이지만 12 초 이상이 걸리면 결과를 무시하고 계속 이동하지 않겠습니까?

다른 팁

Thread.Abort 물론 Win32를 호출하므로 스레드를 닫습니다. TerminateThread.

이 조치의 결과는 귀하가 어떻게 행동하는지에 따라 달라집니다. API 닫히는 걸 좋아해 TerminateThread.

귀하의 메소드가 다음과 같이 호출되는 경우 NuclearPlant.MoveRod() 또는 Defibrillator.Shock(), 차라리 이 30초를 기다리는 게 낫겠어요.

이 방법은 피해자가 정리할 기회를 주지 않습니다.

TerminateThread 스레드를 종료시키는 데 사용됩니다.이런 일이 발생하면, 대상 스레드는 사용자 모드 코드를 실행할 기회가 없습니다..스레드에 연결된 DLL에는 스레드가 종료된다는 알림이 표시되지 않습니다.시스템은 스레드의 초기 스택을 해제합니다.

에 명시된 바와 같이 MSDN:

TerminateThread 가장 극단적인 경우에만 사용해야 하는 위험한 기능입니다.전화해 보세요 TerminateThread 대상 스레드가 수행하는 작업을 정확히 알고 종료 시 대상 스레드가 실행 중일 수 있는 모든 코드를 제어하는 ​​경우에만 가능합니다.예를 들어, TerminateThread 다음과 같은 문제가 발생할 수 있습니다.

  • 대상 스레드가 임계 섹션을 소유한 경우 임계 섹션은 해제되지 않습니다.
  • 대상 스레드가 힙에서 메모리를 할당하는 경우 힙 잠금이 해제되지 않습니다.
  • 대상 스레드가 종료될 때 특정 kernel32 호출을 실행하는 경우 스레드 프로세스의 kernel32 상태가 일관되지 않을 수 있습니다.
  • 대상 스레드가 공유 DLL의 전역 상태를 조작하는 경우 DLL의 상태가 파괴되어 DLL의 다른 사용자에게 영향을 미칠 수 있습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top