2012-05-24 3 views
5

유효성을 검사 할 때까지 메소드를 여러 번 실행해야하는 경우가 있습니다. 제 경우에는 bar.Name.Equals("John Doe")과 같은 표현식이 있습니다.이 표현식이 유효성을 검사 할 때까지 실행하고 실행하려고합니다. 같은boo Foo (params [])를 메소드로 전달 인수

뭔가 :

bool succeeded = TryUntillOk(bar.Name.Equals("John Doe"), 15, 100); 

TryUntillOk는 각 통화 사이의이 100ms의 수면이 발현 15 시간을 실행하는 방법이 될 것입니다.

나는이 excelent 비슷한 문제에 대한 답변 목록을 읽었지만 제 경우에는이 TryUntillOk 메서드가 받아 들일 수있는 표준 대리인이 없습니다.

질문의 제목은 건설적인 것이 아닙니다. 로 호출 될 것이다

bool TryRepeatedly(Func<bool> condition, int maxRepeats, TimeSpan repeatInterval) 
{ 
    for (var i = 0; i < maxRepeats; ++i) 
    { 
     if (condition()) return true; 
     Thread.Sleep(repeatInterval); // or your choice of waiting mechanism 
    } 
    return false; 
} 

은 다음과 같습니다 : 그것은 당신은 아마 이런 식으로 뭔가를 찾고 있습니다

+0

이것은 별도의 스레드에서 실행되고 있습니까? 그렇지 않으면 가치가 바뀔 기회가 없을 것입니다. –

+0

@GeorgeDuckett 예. 그것을 언급하지 않아서 미안해. – Odys

답변

8

:) 편집 주시기 바랍니다

bool succeeded = TryRepeatedly(() => bar.Name.Equals("John Doe"), 
           15, 
           TimeSpan.FromMilliseconds(100)); 

여기에 유일한 흥미로운 부분은 사용자가 지정하는 것입니다 매개 변수를 사용하지 않고 부울을 반환하는 메서드의 대리자 인 조건 Func<bool>. Lambda 표현식 구문을 사용하면 호출 사이트에서 그러한 대리자를 쉽게 만들 수 있습니다.

+0

이것은 아마도 외부 (별도 스레드 등)에 의존하여 결국 조건이 true로 평가된다는 것을 알아야합니다. –

+0

@GeorgeDuckett이 것을 언급하지 않아 죄송합니다. 이 모든 작업자 스레드에서 이루어집니다 – Odys

0

당신은 그것을

delegate void d_name(string s); 

d_name obj =new d_name(bar.Name.Equals); 

bool succeeded = TryUntillOk(obj("John Doe"), 15, 100); 

TryUntillOk(obj d,type parameter2,type parameter3) 
{ 
    //do your work 
} 
1

를 확인하실 수 있습니다 당신은 invokation을 적용해야합니다. @ 존의 대답은 람다 invoaction있다,이 버전은 델타와 comparand를 구분합니다

using System; 
using System.Threading; 

namespace test 
{ 
    class something 
    { 
     public String Name; 
    } 

    class Program 
    { 
     private delegate bool TryableFunction(String s); 

     private static bool TryUntillOk(TryableFunction f, String s, int howoften, int sleepms) 
     { 
      while (howoften-->0) 
      { 
       if (f(s)) return true; 
       Thread.Sleep(sleepms); 
      } 
      return false; 
     } 

     static void Main(string[] args) 
     { 
      something bar=new something(); 

      bar.Name="Jane Doe"; 
      bool succeeded = TryUntillOk(bar.Name.Equals,"John Doe", 15, 100); 
      Console.WriteLine("Succeeded with '{0}': {1}",bar.Name,succeeded); 

      bar.Name="John Doe"; 
      succeeded = TryUntillOk(bar.Name.Equals,"John Doe", 15, 100); 
      Console.WriteLine("Succeeded with '{0}': {1}",bar.Name,succeeded); 
     } 


    } 
} 
+0

정확히 이것은 내 첫 시도했다. 나중에 나는 전화해야할 몇 가지 방법이있을 수 있다는 것을 깨달았다. 나는 피할 수있는 많은 대의원을 선임해야한다는 것을 의미했다. – Odys

+1

... 정확히 람다 버전이 해결하는 것입니다! –