2009-09-23 3 views
2

많은 사람들에게 익숙한 문제가 있습니다. 특정 상황에서 작동하지 않고 예외가 발생하는 호출 (특정하게 Forest.GetCurrentForest())을 만들고 있습니다. 커다란 문제는 아니지만 그냥 잡아서 적절하게 처리하십시오. 그러나 호출이 실패하면 매우 느립니다. 완전히 끝내려면 30 초가 걸립니다.타임 아웃을 사용하여 다른 메소드를 호출하는 범용 메소드를 작성할 수 있습니까?

나는이 메소드를 호출하는 방법을 찾고 있었지만 더 짧은 시간 후에 중지 할 수 있도록 시간 제한을 설정했습니다. 나는 재미있는 제안을 찾았습니다. here 그러나 그것을 해결할 수 있다면 좀 더 일반적인 해결책을 원합니다. 그 솔루션은 시간 초과를 얻으려는 경우 추가 비용이 많이 든다.

CallMethodWithTimeout(Delegate method, int timeout) 

그러나 나는 그런 식으로 작동 할 것이라고 확신하지 못합니다. 그런 일을하는 것에 대한 제안이나 C#에서는 불가능한가요? 우리는 또한 .NET 2.0을 사용하여 붙어 있습니다.

나는 GetCurrentForest() 호출이 일어나지 않는다는 것을 알아 내기 위해 30 초가 걸리지 않도록주의 할 것입니다. 비록 일반적인 메서드 호출자 메서드의 실현 가능성에 대해 알고 싶습니다.

+0

무슨 일이 있어도 사용하지 마십시오 'Thread.Abort' 또는'Thread.Interrupt'. :) – Joren

+0

할 것입니다. 아니면 ... 하지마. ;) 답변 해 주셔서 감사합니다. 지금 당장은이 문제를 해결할 수있을 것 같지만 앞으로 어떤 일이 발생할 때 제안을하게되어 기쁩니다. – CodexArcanum

답변

2

나는 그것을 생각을 조금 포기하고 (기본적으로 내가 코딩 동안 마이클이 쓴의 구현입니다) 다음과 같은 방법을 함께했다 :

private static bool TimedMethodCaller(Delegate dlgt, int timeout, 
    params object[] args) 
{ 
    ManualResetEvent waitHandle = new ManualResetEvent(false); 
    Thread t = new Thread(new ThreadStart(delegate 
     { 
      dlgt.Method.Invoke(dlgt.Target, args); 
      waitHandle.Set(); 
     })); 
    t.Start(); 
    return waitHandle.WaitOne(timeout); 
} 

을 당신이 무엇에 게시 할 수있는이 방법을 사용하여 위임자 및 매개 변수가 필요합니다. 반환 값을 처리하지 못한다는 단점이 있습니다 (그러나 어떤 식 으로든이를 달성 할 수 있습니다).

당신과 같이 호출 할 수 있습니다 :

// parameter-less method call 
bool success = TimedMethodCaller(new Action(ParamlessTestMethod), 100); 

을 당신이 피팅 위임이 필요합니다 매개 변수를 사용하는 방법을 호출 할 경우

// call with one parameter (using the Action<T> delegate of the framework 
bool success = TimedMethodCaller(new Action<int>(TestMethod), 100, "text"); 

// call with several parameters using custom delegate that is defined like this: 
// public delegate void SampleDelegate(string text, int numeric); 
bool success = TimedMethodCaller(new SampleDelegate(TestMethod), 100, "text", 1); 
2

당신이 직접 할 수없는 취소 불능 취소 해 작업 (this link 그것을 위해 경화되지 않은 코드에서 비동기 예외가 몇 가지 문제에 대해 설명합니다.) 내가 본

한 패턴이 일을 대기하는 것입니다 다른 스레드로 보내지 만 제한된 시간 동안 만 기다려서 완료하십시오. 너무 오래 걸리면 요청을 효과적으로 포기합니다. 이것은 out-right 취소는 아니지만 응용 프로그램의 응답 성을 유지하는 데 도움이 될 수 있습니다.

관련 문제