2012-05-24 32 views
5

कई बार एक विधि को मान्य होने तक कई बार चलाने की आवश्यकता होती है। मेरे मामले में bar.Name.Equals("John Doe") जैसे भाव हैं जो मैं इस अभिव्यक्ति को मान्य होने तक चलाने और चलाने के लिए चाहता हूं।विधि के रूप में एक बूल फू (पैराम्स []) पास करें तर्क

कुछ की तरह:

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

@ जॉर्ज डकेट यस। इसका जिक्र करने के लिए खेद है। – Odys

उत्तर

8

आप शायद कुछ इस तरह की तलाश कर रहे स्वतंत्र महसूस

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

यहाँ केवल दिलचस्प बात यह है कि आपके द्वारा निर्दिष्ट है Func<bool> के रूप में स्थिति, जो एक विधि के लिए एक प्रतिनिधि है जो कोई पैरामीटर नहीं लेती है और एक बूलियन लौटाती है। लैम्ब्डा अभिव्यक्ति वाक्यविन्यास आपको कॉल साइट पर ऐसे प्रतिनिधि को तुच्छ रूप से बनाने की अनुमति देता है।

+0

यह शायद ध्यान दिया जाना चाहिए कि यह कुछ बाहरी (अलग थ्रेड इत्यादि) पर निर्भर करता है जिससे स्थिति अंततः सही साबित हो जाती है। –

+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 अनुकूल करने के लिए किया है। @ जॉन के जवाब में लैम्ब्डा चालान है, यह संस्करण प्रतिनिधि से तुलना को अलग करता है

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

... जो वास्तव में लैम्ब्डा संस्करण हल करता है! –