2017-09-27 2 views
0

우리 프로그램이 DLL에서 알 수없는 메서드를 실행하고 있습니다. 경우에 따라 이러한 메서드는 시간 제한을 처리하지 않으며 값을 반환하지 않습니다.시간 초과 후 중단 된 메서드 중단

따라서 우리의 Methodinfo.invoke (...)는이 줄에서 영원히 멈출 것입니다.

Google의 방법을 중단 할 수있는 적절한 방법이 있습니까? 나는이 방법을 비동기 적으로 실행해야하는데, 문제가 없다는 것을 이해한다.

여기의 요청에 따라

시각화에 대한 몇 가지 작은 예입니다 : 내가 파일 핸들과 같은이 DLL 내에 할당되어있는 경우 ThreadAbortException 작동하지하려고 할 것이다 주석의 제안으로

public string startTheDLLMethod(int timeout) 
    { 
     var methodinfo = "..."; 

     return methodGettingStuck(methodinfo); //todo, abort this after timeout 
    } 

    public string methodGettingStuck(methodinfo) 
    { 
     var1 = ""; 
     var2 = ""; 

     methodinfo.Invoke(var1, var2); //Stuck. 
    } 
+0

'ThreadAbortException'? [mcve]를 입력하십시오. – dymanoid

+0

['CancellationTokenSource'] (https://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource (v = vs.110) .aspx)에 대해 자세히 알아보십시오. – Shreevardhan

+0

CancellationTokenSource가 1 줄에 멈추는 동안 CancellationTokenSource가 메소드를 중지 할 수 있다고 주장하십니까? – humudu

답변

3

.

은 그러나 여기 당신은 간다 :

public void BlockingCallWithTimeout() 
    { 
     Semaphore waitHandle = new Semaphore(0,1); 
     Thread thread = new Thread(this.Wrapper); 
     Timer timer = new Timer(state => 
     { 
      thread.Abort(); 
      waitHandle.Release(); 
     },null,5000,0); 

     thread.Start(waitHandle); 

     waitHandle.WaitOne(); //wait until completion or until timeout 
     timer.Dispose(); 
    } 

    public void Wrapper(object state) 
    { 
     Semaphore semaphore = (Semaphore)state; 

     //Call DLL Method 

     semaphore.Release(); 
    } 

당신은 코드 (그것을 시도하지 않았다)에 어딘가에 ThreadAbortException이 처리해야합니다. 이 코드는 예제 일뿐입니다! 타임 아웃과 성공이 동시에 발생하는 경우를 처리해야합니다. 따라서 Timer는 실행되는 즉시 처리되지 않으며 처리해야 할 경쟁 조건이 더있을 수 있습니다.

+0

문자열을 반환하고 여러 객체와 변수를 매개 변수로 사용할 필요가 있기 때문에 약간의 어려움을 겪었지만 그 문제를 해결했습니다. 솔루션이 작동하면서 스레드를 중단하면 문제가 발생할 수 있지만 최소한 사용자에게 내 프로그램이 아니라 잘못된 DLL이라고 알려줄 수 있습니다. 감사합니다 – humudu

+0

업데이트 : 메서드가 COM 포트와 같은 리소스를 사용하고 있고 스레드를 중단하면 "안전 핸들이 닫혔습니다"라는 오류가 발생하고 프로그램이 다운됩니다. 하지만 나는 다른 appdomain에서 실행 스레드를 가짐으로써이를 해결할 수있었습니다. https://stackoverflow.com/questions/46562227/safe-handle-has-been-closed-thread-abort-can-program-crash-be-avoided – humudu