2011-02-17 2 views
3

다른 스레드에서 완료하고 다시 시작하는 데 2 ​​초 이상 걸리는 경우 메서드 실행을 취소해야한다는 요구 사항이 있습니다.메서드 실행 시간을 계산하는 방법은 무엇입니까?

그래서 어떤 방법이든/콜백 메커니즘/해킹이 있나, 메소드가 2 초 제한 시간을 넘었다는 것을 알릴 수 있습니까?

+1

왜 당신이 처음부터 다른 스레드에서 시작하지? –

+0

솔직히 묻고있는 일을 정확하게 수행하는 방법이 없다고 생각합니다. 그 곳 곳곳에 고리가 있어야합니다. 호출 스레드에서 먼저 메서드를 호출하면 어떻게해야합니까? – Ani

답변

3

check if network drive exists with timeout in c#
https://web.archive.org/web/20140222210133/http://kossovsky.net/index.php/2009/07/csharp-how-to-limit-method-execution-time

비동기 패턴 :

public static T SafeLimex<T>(Func<T> F, int Timeout, out bool Completed) 
    { 
     var iar = F.BeginInvoke(null, new object()); 
     if (iar.AsyncWaitHandle.WaitOne(Timeout)) 
     { 
      Completed = true; 
      return F.EndInvoke(iar); 
     } 
     F.EndInvoke(iar); //not calling EndInvoke will result in a memory leak 
     Completed = false; 
     return default(T); 
    } 
2

2 초에 System.Threading.Timer를 만들고 다른 스레드에서 메서드를 실행하고 콜백을 기다려야합니다. 타이머가 실행되기 전에 메서드가 완료되면 타이머를 처리해야합니다. 그렇지 않으면 메서드가있는 스레드를 중단해야합니다. 실행 중입니다. 이것은 당신이 당신이 그것을 찾을 수 있다면 그것은 좋은 것입니다 귀하의 방법

+0

+1 그게 합리적인 소리, 감사합니다 –

+0

이것은 완벽하게 내 요구 사항에 맞게, 감사합니다! – fjdumont

1

를 실행 스레드를 중단해야 BreakFunction에서 예를

using (new Timer(BreakFunction, true, TimeSpan.FromMinutes(2), Timeout.Infinite)) 
        { 
         //TODO:here you should create another thread that will run your method 
        } 

꽤 간단합니다. 나도 그걸 찾고 있었어.

보통 내가하는 일은이 방법을 다른 Thread에서 시작하고 Timer을이 경우 2 초로 시작하십시오. 는 이벤트를 발생 처음, 그냥 수행

if (a.IsAlive) 
{ 
    a.Abort(); 
} 

두 가지 중요한 일 :

  • Abort()를 호출 할 때 타이머
  • 을 처리하는 방법으로 볼 수 있어야 선언 Thread, 그것은 제기를 ThreadAbortException이므로 올바르게 처리해야합니다.